problème réception port série.

problème réception port série. - C - Programmation

Marsh Posté le 08-03-2012 à 19:22:50    

Salut à tous,
 
Je suis en train de coder une appli en c pour récupérer des données sur un port série.
 
voilà mon code :
 

Code :
  1. int Read_Serie2(int SerieID)
  2. {
  3.        char entete[10];
  4. int nbbytes = 0;
  5. int i;
  6.     ReadFile(SerieID, &(entete[0]), 1, (LPDWORD)&nbbytes, NULL);
  7.     if(entete[0]==0x7E)
  8.     {
  9.         for(i=1; i<=2;i++)
  10.         {
  11.                 ReadFile(SerieID, &(entete[i]), 1, (LPDWORD)&nbbytes, NULL);
  12.             }
  13.             for(i=3; i<=entete[2];i++)
  14.         {
  15.                 ReadFile(SerieID, &(entete[i]), 1, (LPDWORD)&nbbytes, NULL);
  16.             }
  17.         printf("l'entete = 0x%x.\n",entete[0]);
  18.         printf("longeur trame = 0x%.2x.\n",entete[1]);
  19.         printf("longeur trame = 0x%.2x.\n",entete[2]);
  20.             printf("Les donnees en hexa sont : " );
  21.             for (i = 3; i < entete[2]+3; i++)
  22.             {
  23.                 printf("0x%.2x ", entete[i]);
  24.             }
  25.             printf("\n" );
  26.         }
  27. return 0;
  28. }


 
Mon programme marche bien mais je reçois des données en trop. J'ai donc regardé avec un sniffer de port série et j'ai à l'entré de mon port série ça :  
7E 00 14 90 00 13 A2 00 40 62 A9 25 7F 20 01 54 78 44 61 74 61 30 41 F3
Ma trame attendu.
 
mais après réception par mon programme en c j'ai ça :
7e 00 14 ffffff90 00 13 ffffffa2 00 40 62 ffffffa9 25 7f 20 1 54 78 44 61 74 61 30 41 fffffff3
 
Savez vous pourquoi? Pourquoi je reçois des ffffff en plus?
 
Merci

Reply

Marsh Posté le 08-03-2012 à 19:22:50   

Reply

Marsh Posté le 09-03-2012 à 17:40:42    

Peut être un problème de paramétrage du port série? Mais après je suis pas un super pro du port série  :(  
 

Code :
  1. int Open_Serie(int *SerieID,char port[])
  2. {
  3.     DCB dcb;
  4. *SerieID = CreateFile(
  5.  port,
  6.  GENERIC_READ | GENERIC_WRITE,
  7.  0,    // Must be opened with exclusive-access.
  8.  NULL, // No security attributes.
  9.  OPEN_EXISTING, // Must use OPEN_EXISTING.
  10.  0,    // Not overlapped I/O.
  11.  NULL  // hTemplate must be NULL for comm devices.
  12.  );
  13.     if (*SerieID == INVALID_HANDLE_VALUE)
  14.  return -1;
  15.     memset(&dcb, 0, sizeof(DCB));
  16. // Get the port options.
  17. if (!GetCommState(*SerieID, &dcb))
  18.  return -1;
  19. // Modify some options. See the MSDN documentation for more information.
  20. dcb.BaudRate = 9600;
  21. dcb.Parity = NOPARITY;
  22. dcb.ByteSize = 8;
  23. dcb.StopBits = ONESTOPBIT;
  24. // Apply the new options.
  25. if (!SetCommState(*SerieID, &dcb))
  26.  return -1;
  27.     return 0;
  28. }


 
 
Merci encore de votre aide

Reply

Marsh Posté le 10-03-2012 à 00:24:51    

je te donne un indice. tu remarqueras que tous les octets ayant FFFFFF en plus sont supérieurs à 0x7F.  
 
C'est un problème de signe : char est signé donc si tu lis une valeur supérieure à 0x7F , sa valeur décimale sera négative.
 
Par exemple: 0xA9 vaut -87 en décimal ( un char variant entre -128 et + 127 ). Or en plus, tu demandes un affichage %x, c'est à dire en 32 bits. Donc ton -87 est converti en 32 bits, et -87 en hexadécimal 32bits s'écrit FFFFFFA9.
 
change ton char entete[12] en unsigned char entete[12].

Reply

Marsh Posté le 12-03-2012 à 10:44:18    

Merci, j'avais vraiment pas pensé à ça.
 
Merci encore

Reply

Marsh Posté le 21-04-2012 à 17:06:11    

Bonjour,
J'aimerais savoir quel port tu utilise avec "SerieID" et si ce programme fonctionne avec tout les port séries ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed