Liaison serie dev-c++

cs_jicez Messages postés 7 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 27 mars 2006 - 25 mars 2006 à 14:54
phoenix_2406 Messages postés 15 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 26 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;

}

6 réponses

Tekila48 Messages postés 15 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 26 mars 2006
25 mars 2006 à 15:14
que te revoit la fonction ReceptionCom ?

*pCountRead est-il égal à 0 ? Comment essaies-tu de lire lpBuf ?

Comment sais-tu que tu arrives à recevoir quelquechose ? nCarALire != 0 ?

En passant : pourquoi n'utilises-tu pas directement pCountRead dans la fonction ReadFile ?
0
cs_jicez Messages postés 7 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 27 mars 2006
25 mars 2006 à 15:29
Ah oui, je parle du pointeur "*TrameRecue" mais je ne dit pas où je l'utilise désolé.

Pour l'émission je fais :

OuvreCom(PORT2,V9600,BITS_8,PARITE_PAIRE,BIT_DE_STOP_1);

int i = 50;
unsigned char test[250];
sprintf (test , %d ,i);
EmissionCom(test,1); //le 1 pour envoyer un seul octet

Pour la réception :

unsigned char* TrameRecue[100];
unsigned int NbMaxCar=100;
unsigned int NbCarRecus;

OuvreCom(PORT1,V9600,BITS_8,PARITE_PAIRE,BIT_DE_STOP_1);

ReceptionCom(TrameRecue,NbMaxCar,NbCarRecus);

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.
0
Tekila48 Messages postés 15 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 26 mars 2006
26 mars 2006 à 10:21
sprintf(test, %d, i); //==> Test = "50" donc

Test[0] = '5'
Test[1] = '0'
Test[2] = '\0'

En envoyant un seul octet, tu n'envoies que le 5.
En récupérant un unsigned int, tu vas récuperer le code ASCII de 5, soit 53 (ou 0x35).

Est-ce que ca colle avec ce que tu recois ?
0
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
26 mars 2006 à 20:01
Tu es sûr que le SetCommState s'est fait comme il faut ? Parce que perso j'ai eu bien des problèmes rendus là :$

http://vbaddons.free.fr
MSN : x_men_40(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jicez Messages postés 7 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 27 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...

Je vais bien trouver !! En tout cas merci encore.
0
phoenix_2406 Messages postés 15 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 26 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

phoenix
0
Rejoignez-nous