dmk04
Messages postés206Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 7 mars 2012
-
3 mai 2006 à 11:58
dmk04
Messages postés206Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 7 mars 2012
-
3 mai 2006 à 15:41
Bonjour,
J'ai un problème avec un pointeur...
Contexte : j'envoie une trame à un periphérique connecté sur port série, le périphérique répond.
Mon problème se situe à la réception de la réponse.
Dans mon main j'appel une fonction "recevoir" qui va lire le buffer via une fonction lireBuffer après un WaitCommEvent (le port série ne me pose pas de problèmes). Lorsque je lis le buffer récupéré via ReadFile dans la fonction 'lireBuffer" ca marche, mais dans "recevoir" j'ai une erreur deboguage / envoyer le rapport d'erreur / ne pas envoyer).
// Permet de lire les octets dans le buffer du port série
int LiaisonSerie::lireBuffer(void * telBuffer)
{
if(handleCom == NULL)
{ // si la connexion n'est pas établie
messageErreur(Err_Connexion);
return Err_Connexion;
}
//Pour connaitre le nombre d'octets dans le buffer d'entrée
COMSTAT stat;
DWORD errors;
ClearCommError(handleCom,&errors,&stat);
// nb de caracteres dans le buffer
int nbCarALire = stat.cbInQue;
if(nbCarALire==0)
{ // si le buffer est vide
messageErreur(Err_Buffer_Vide);
return Err_Buffer_Vide;
}
telBuffer = new char(nbCarALire);
//On effectue la lecture si il y a des caractères présents
unsigned long nbCarLus = 0;
if(ReadFile(handleCom,telBuffer,nbCarALire,&nbCarLus,NULL)==0)
{ // Echec
messageErreur(Err_Reception);
return Err_Reception;
}
cout<<"nb caracteres a lire : "<<nbCarALire<<endl;
cout<<"contenu buffer lu : "<<(char*)telBuffer<<" taille : "<<strlen((char*)telBuffer)<<endl;
cout<<"nb caracteres lus : "<<nbCarLus<<endl;
return EXIT_SUCCESS; // la reception est finie
}// lireBuffer
// Permet de recevoir des octets sur le liaison série, si les données ne sont pas encore arrivée, on les attend telNbSecAttente secondes
int LiaisonSerie::recevoir(void * telBuffer)
{
int nbCarALire = 0;
int leRetour = Err_Buffer_Vide;
while(leRetour == Err_Buffer_Vide)
{
if(!WaitCommEvent(handleCom, &commMask, NULL))
{
messageErreur(Err_WaitCommEvent);
return Err_WaitCommEvent;
}
leRetour = lireBuffer(&telBuffer);
}
if(leRetour==Err_Reception)
return Err_Reception;
//########### PROBLEME ###########
// Je n'arrive pas à affichier le contenu de telBuffer
// Dans la fonction lireBuffer ca marche, mais pas là. -> Message d'erreur (deboguage / envoyer le rapport d'erreur / ne pas envoyer)
cout<<"(recevoir) telBuffer : "<<(char*)telBuffer<<endl;
return EXIT_SUCCESS;
}// recevoir
int main()
{
....
LiaisonSerie * comMoteur = new LiaisonSerie();.
...
char * TrameRecueMoteur;
comMoteur->recevoir(TrameRecueMoteur);
...
}
Note : mon main est OK le problème c'est mon buffer
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 3 mai 2006 à 12:28
Ah j'savais pas qu'il y avait ce genre de constructeur pour les char enfin constructeur c'est vite dit mais bon
Ca se rapproche de ce concept quand même
if(!Meilleur("Joky")) return ERREUR;<
Vous n’avez pas trouvé la réponse que vous recherchez ?
dmk04
Messages postés206Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 7 mars 2012 3 mai 2006 à 13:16
ok,
j'ai essayer new char[nbCarALire], char[nbCarALire+1], char(nbCarALire+1), avec un memset(telBuffer,0,nbCarALire) ou memset(telBuffer,0,nbCarALire+1), mais toujours le même résultat.
Voilà ce qui s'affiche :
nb caracteres a lire : 1
contenu buffer lu : r taille : 1
nb caracteres lus : 1
(recevoir) telBuffer :
Message d'erreur (deboguage / envoyer le rapport d'erreur / ne pas envoyer).
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 3 mai 2006 à 13:40
Bé c'est pour toi qu'on dit ça sur les [] parce que new char( ... ) ça te construit un seul caractère et pas le nombre que tu veux donc forcément
après si tu veux écrire 5 caractères dedans pas possible...
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 3 mai 2006 à 14:31
salut.
tu peux peut etre faire comme ca :
char * test()
{
char *buf = new char[5];
memset(buf,'\0',5);
strcpy((char*)buf,"test");
cout<<"test : "<<(char*)buf<<endl;
return buf;
}
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 3 mai 2006 à 14:43
si tu veux que test renvoi un entier et alloue la mémoire, il faut qu'un des 2 soit passé en référence...
Le mieux c'est quand même d'allouer le buffer avant d'appeler la fct, de le passer en paramètre ainsi que la taille
ton code d'erreur pourra alors renvoyer si des octets sonyt encore à lire parceque le buffer était trop petit