Problème reception données port serie

Problème reception données port serie - C - Programmation

Marsh Posté le 31-08-2013 à 20:43:50    

Bonsoir,
 
Je suis en train de faire un programme en C pour récupérer des données du port série. Il y a un module XBee connecté dessus.
 
Je reçois normalement des octes de cette forme pour une trame xbee :

Code :
  1. 7E 00 12 90 00 7D 33 A2 00 40 62 A9 25 61 6B 01 32 37 2E 35 30 00 81


 
Mais mon problème c'est qu'a la reception et à l'affichage je reçois defois plus de 8bits comme par exemple :
 

Code :
  1. 0x13 0xffffffa2 0 0x40 0x62 0xffffffa9 0x25


 
au lieu de  
 

Code :
  1. 0x13 0xa2 0 0x40 0x62 0xa9 0x25


 
Quand je fais une analyse de trame avec le programme de digi X-CTU il n'y a pas de problème.
 
Savez vous pourquoi je reçois des fois les octes avec des bits de poids fort à 1 au lieux de 0 ? Comment faire pour résoudre le problème?
 
Merci
 
Mon code :
 

Code :
  1. do
  2. {
  3. ReadCOM(portnum,1,readbuffer);
  4. printf("donnees : %#x\n",readbuffer[0]);
  5. if(readbuffer[0]==0x7E)
  6.  {
  7.  // Récupération du nombres d'octes que compose la tram
  8.  ReadCOM(portnum,2,readbuffer);
  9.  printf("donnees : %#x %#x\n",readbuffer[0], readbuffer[1]);
  10.  nombres_octes=(int)readbuffer[1];
  11.  printf( "longueur de la frame : %d \n",nombres_octes );
  12.  //readbuffer[0]=0;
  13.  // Récupération du type de la trame
  14.  ReadCOM(portnum,1,readbuffer);
  15.  if(readbuffer[0]==0x90)
  16.  {
  17.  // Lecture caractère echapement
  18.  ReadCOM(portnum,2,readbuffer);
  19.  // Application Xor 0x20 sur l'octect suivant
  20.  ReadCOM(portnum,1,readbuffer);
  21.  addr64[0]= readbuffer[0]^0x20;
  22.  // lecture du reste de l'adresse 64Bits
  23.  //printf("donnees : %#x \n",readbuffer[0]);
  24.  for(i=1; i<7; i++)
  25.  {
  26.   ReadCOM(portnum,1,readbuffer);
  27.   addr64[i]=readbuffer[0];
  28.  }
  29.  printf( "L'adresse est : " );
  30.  for(i=0; i<7; i++)
  31.  {
  32.   printf("%#0.2x ",addr64[i]);
  33.  }
  34.  // lecture de l'adresse 16Bits
  35.  ReadCOM(portnum,2,readbuffer);
  36.  // Lecture option
  37.  ReadCOM(portnum,1,readbuffer);
  38.  // Lecture data
  39.  nombre_hexa -= 12;
  40.  //printf( "decimal=%d \n",nombre_hexa );
  41.  ReadCOM(portnum,nombre_hexa,readbuffer);
  42.  //char temp = readbuffer[0]
  43.  // Lecture checksum
  44.  ReadCOM(portnum,1,readbuffer);
  45.  }
  46.  fin_trame=0;
  47.  }
  48. }
  49. while(fin_trame==0);

Reply

Marsh Posté le 31-08-2013 à 20:43:50   

Reply

Marsh Posté le 31-08-2013 à 22:51:49    

Bonjour !
 
Comment addr64 est-il déclaré ? Si il est déclaré en char, il est signé et l'affichage peut, en effet, donner ça, tandis que s'il est déclaré en (unsigned char *) cela devrait être différent.
 
Au pire, vous pouvez caster le addr64[i] en unsigned dans le printf.
 
Bonne continuation !

Reply

Marsh Posté le 01-09-2013 à 21:10:58    

Nikel ça marche.
 
Merci beaucoup

Reply

Sujets relatifs:

Leave a Replay

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