cs_jicez
Messages postés7Date d'inscriptiondimanche 5 mars 2006StatutMembreDernière intervention27 mars 2006
-
25 mars 2006 à 14:54
phoenix_2406
Messages postés15Date d'inscriptionvendredi 18 mai 2007StatutMembreDernière intervention26 mars 2009
-
26 mars 2009 à 18:25
Bonjour à tous !
Voilà, j'essaye désespérement de mettre en place une laison série sous Dev-c++.
J'ai essayé plusieurs codes récupérés ici et ailleurs, et je m'y prend surement mal mais le résultat est que ça ne marche pas.
Le code ci-dessous a été récupéré ici, c'est celui qui m'a l'air le plus explicite.
J'aimerais envoyé un "long int" ; Je me doute que le pointeur "*TrameRecue" pointe sur l'adresse de l'info à récupérer, mais je reçoit carrément pas l'envoi.
Je sais que j'arrive à recevoir qqch mais j'arrive pas à extraire l'info.
Si vous pouviez m'aider svp, sois en me disant comment bien utiliser ces fonctions, sois en me proposant un autre code.
Merci.
//----------------------------------------------------------------------------
// FONCTION : EmissionCom
//----------------------------------------------------------------------------
// DESCRIPTION :
// Emission d'octets sur la liaison série
//
//----------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur les octets a emettre
// -nCount Nombre d'octet a emettre
//
//----------------------------------------------------------------------------
// RETOUR :Code d'erreur
//----------------------------------------------------------------------------
e_ErrCom EmissionCom(const void* lpBuf,unsigned int nCount)
{
HWND hwnd;
DWORD NumBytes=0;
if(g_hCom!=NULL)
{
// On pari sur pas d'erreur
g_ErrCom=e_ErrCom_None;
//Emission du buffer
if(WriteFile(g_hCom,lpBuf,nCount,&NumBytes,NULL)==0)
{
g_ErrCom=e_ErrCom_Emission;
MessageBox(hwnd, "Erreur d'emission", "Erreur", MB_OK | MB_ICONEXCLAMATION);
}
MessageBox(hwnd, "emission marche", "Erreur", MB_OK | MB_ICONEXCLAMATION);
}
else
//Le port n'a pas été ouvert
MessageBox(hwnd, "echec de l'ouverture du port", "Erreur", MB_OK | MB_ICONEXCLAMATION);
return g_ErrCom;
}
//---------------------------------------------------------------------------
// FONCTION : ReceptionCom
//---------------------------------------------------------------------------
// DESCRIPTION :
// Reception de caractères sur la liaison série
//
//---------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur le buffer de caractère a lire
// -nCountMax Nombre maxi de caractère a lire
// -pCountRead Pointeur sur le nombre de caractères lus
//---------------------------------------------------------------------------
// RETOUR :Code d'erreur
//---------------------------------------------------------------------------
e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead)
{
COMSTAT Stat;
DWORD Errors;
unsigned int nCarALire;
unsigned long NCarLus=0;
HWND hwnd;
if(g_hCom!=NULL)
{
//on pari sur pas d'erreur
g_ErrCom=e_ErrCom_None;
//Pour éviter de gérer un time out
Sleep(500);
//Pour connaitre le nombre d'octets dans le buffer d'entrée
ClearCommError(g_hCom,&Errors,&Stat);
nCarALire=Stat.cbInQue;
//On effectue la lecture si il y a des caractères présents
if( (nCarALire>0)&&(nCarALire<=nCountMax) )
{
if(ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0)
{
g_ErrCom=e_ErrCom_Reception;
MessageBox(hwnd, "erreur de reception", "Erreur", MB_OK | MB_ICONEXCLAMATION);
}
}
*pCountRead=NCarLus;
}
else
//Le port n a pas été ouvert
MessageBox(hwnd, "echec de l'ouverture du port", "Erreur", MB_OK | MB_ICONEXCLAMATION);
//Compte rendu de l'exécution
return g_ErrCom;
if(TrameRecue != NULL) // je rentre bien ici
{
// traitement
}
J'ai déjà essayé en mettant dans un "unsigned int" ce que pointe "*TrameRecue" mais je reçoit un truc pas logique.
Pour te répondre ce que renvoie les fonctions ce n'est qu'un code d'erreur qui est traité ailleurs. Le truc c'est que je n'est pas de message box qui me m'indique une erreur, donc c'est que qqch est envoyé et réceptionné. En tout cas merci de te pencher sur mon probleme.
cs_jicez
Messages postés7Date d'inscriptiondimanche 5 mars 2006StatutMembreDernière intervention27 mars 2006 27 mars 2006 à 18:51
salut !!
Merci d'avoir prêter attention à mon problème.
En convertissant mon "int" en "char" avec "sprintf" et en le reconvertissant en "int" à la réception, jarrive à transmettre mes données !!!!
Je sais que pour convertir mon "char" en "int" il faut que je mette un caractère de fin de chaine (\0) mais lors de l'envoie le caractère se met automatiquement puisque c'est un "char" ??
Mon programme est un petit pong que j'essaie de mettre en série. J'ai un maitre qui envoie des coordonnées et un esclave qui récupère et qui fait que afficher. Donc j'envoie que des "int" par série. En ce moment je suis bien en galère car ça plante malgrè une bonne connexion, mais le truc c'est que je ne sais pas pourquoi...lol
Est-ce à cause du temps de transmission, ou est-ce que les données se croisent...
phoenix_2406
Messages postés15Date d'inscriptionvendredi 18 mai 2007StatutMembreDernière intervention26 mars 2009 26 mars 2009 à 18:25
Bonjour à tous !! Voila je viens de lire ce code et je me pose une petite question, j'aimerai pouvoir envoyer par le port série le mot binaire suivant : 01010101! Cependant comment faire pour trouver le i correspondant dans cette partie de code :
int i= 50;
unsigned char test[250];
sprintf (test , %d ,i);
EmissionCom(test,1); //le 1 pour envoyer un seul octet
J'aimerai que l'on m'explique la méthode
Merci d'avance