2010-03-28 11 views
0

J'écris un programme qui lit les données du port série sous Linux. Les données sont envoyées par un autre appareil avec le format de trame qui suit:Extraire les données erronées d'une image dans C?

 

|start | Command | Data    | CRC | End | 
|0x02 | 0x41 | (0-127 octets)  |  | 0x03| 
---------------------------------------------------- 
 

Le champ de données contient 127 octets comme indiqué et 1,2 octet contient un type de données; l'octet 3,4 contient une autre donnée. J'ai besoin de ces données. Parce que dans C, un octet ne peut contenir qu'un caractère et dans le champ de début de la trame, c'est 0x02 qui signifie STX qui est de 3 caractères.

Ainsi, afin de tester mon programme,

Du côté de l'expéditeur, je construis un tableau comme le cadre formaté ci-dessus comme:

 

char frame[254]; 
frame[0] = 0x02; // starting field 
frame[1] = 0x41; // command field which is character 'A' 
..so on.. 
 

Et puis sur le côté du récepteur, je prends les champs comme:

 

char result[254]; 
// read data 
read(result); 
printf("command = %c", result[1]); // get the command field of the frame 

// get other field's values 

la valeur du champ de commande (résultat [1]) n'est pas le caractère 'A'.

Je pense que cela parce que la première valeur de champ de la trame est 0x02 (STX) occupant 3 premières places dans la trame de la matrice et conduisant à des résultats erronés du côté du récepteur.

Comment puis-je corriger le problème ou suis-je en train de faire quelque chose de mal du côté de l'expéditeur?

questions connexes:
Parse and read data frame in C?
Clear data at serial port in Linux in C?

+1

Que contient * * le tampon? Quelle fonction appelez-vous pour effectuer la lecture? (Ce n'est clairement pas un appel système 'read'.) Avez-vous vérifié le lien série avec une application de terminal? – Potatoswatter

+0

'STX' ne prend pas 3 octets; tous les caractères prennent 1 octet. Certains caractères (comme 'STX') ont juste des noms plus longs. – Gabe

+0

le code complet de la fonction read() est ici: http://stackoverflow.com/questions/2500567/parse-and-read-data-frame-in-c. Je le pense aussi. Si j'appelle le résultat [1], la valeur devrait être 0x41 ce qui signifie «A», n'est-ce pas? Mais ce n'est pas. Je renvoie une valeur étrange. Est-ce que je me trompe? – ipkiss

Répondre

0

Si votre programme contient effectivement

read(result); 

alors vous devez ajouter

#include <unistd.h> 

en haut, pour obtenir le prototype de la fonction pour read. Ensuite, vous devez open le port série et transmettre le descripteur de fichier résultant à read avec votre tampon, afin qu'il sache quoi lire. Voir man 2 read et man 2 open.

+0

Si vous regardez http://stackoverflow.com/questions/2500567/parse-and-read-data-frame-in-c vous verrez que sa fonction de lecture est OK. – Gabe