Rechercher : dans
Par :

[C++] Lire une trame hexa avec Readfile

Dernière réponse le 9 nov 2009 à 00:13:53 Lit seulement jusqu'a '00', le 16 mar 2009 à 14:16:00 
 Signaler ce message aux modérateurs

Bonjour à tous,

Voila je suis en train de préparer un projet et je doit lire une trame venant d'un appareil de production par le port série

j'utilise C++ builder avec XP pro et la fonction ReadFile pour lire mon port série.

Je recois bien une trame du genre : 12 03 54 78 51 24 95 87 45 21 FF (hexa)
FF signifie la fin de ma trame et mon programme le sait.
Je recois parfaitement une trame de ce genre.

Le problème, c'est que si dans ma trame j'ai un '00' readfile va me lire jusqu'à ce 00

Ex : si ma trame est : 06 45 12 02 84 00 45 87 45 92 FF
je vais avoir dans mon buffer : 06 45 12 02 84 et c'est tout!

Mais moi j'ai besoin de mon 00 car je doit récupéré des information dans ma trame (decodage)!!! :o

comment puis-je faire pour récupéré ma trame complète?

Merci

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « [C++] Lire une trame hexa avec Readfile » dans :
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
[Gravure] Graver ou lire un fichier .BIN / .CUE VoirLes fichiers .bin et .cue sont respectivement : .BIN : une image de CD, c'est-à-dire une copie binaire d'un CD ou d'un DVD sous forme d'un fichier .CUE : informations sur les pistes du disque. Les fichiers .BIN / .CUE sont utilisables par...
Comme lire les mp4 avec une PSP 3000 VoirProblème Comment lire les mp4 sur une PSP 3000 ? Solution Sur le mémory stick , dans PSP, créer un dossier nommé 'MUSIC". C'est le plus simple car il suffit de prendre vos MP3 et de les déposer dedans. Sur le mémory stick , à coté de PSP ,...
Analyseurs réseau (sniffers) VoirL'analyse de réseau Un « analyseur réseau » (appelé également analyseur de trames ou en anglais sniffer, traduisez « renifleur ») est un dispositif permettant d'« écouter » le trafic d'un réseau, c'est-à-dire de capturer les informations qui y...

1

Char Snipeur, le 16 mar 2009 à 16:26:08

Salut.
Tu peux créer ta propre fonction readfile qui lit la trame jusqu'à obtenir le FF final.
Une fonction readCom() faisant appel à readFile(). Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

13

Henri, le 4 sep 2009 à 10:43:52

Au lieu de répondre n'importe quoi, abstiens-toi.
Merci.

Répondre à Henri

14

Char Snipeur, le 4 sep 2009 à 11:57:12

Au lieu de toujours tout critiquer sans rien apporter, aide un peu.
Merci. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

2

Lit seulement jusqu'a '00', le 17 mar 2009 à 08:12:15

Je ne vois pas ou c'a m'aide?!!
j'utiliseré toujours ReadFile et mon problème reste le même!

:o

Répondre à Lit seulement jusqu'a '00'

3

Char Snipeur, le 17 mar 2009 à 08:27:39

Je n'ai jamais fait de programmation de ce genre, mais je pense que ça doit être du même genre que lire une socket ou un fichier, ou un flux standard.
Il doit y avoir un buffer stokant les trame en attente d'être lu.
Je suppose que la fonction ton tu me parle agit un peu comme les autre fonctions de flux, le lisant jusqu'à recontrer la fin ou un autre critère d'arrêt.
Ce que je te dit, c'est de relancer readFile jusqu'à avoir FF.
Genre :
readCom(){
buffer[0]=readFile();
While(dernier caractère du buffer courant != FF)
buffer[i]=readFile();
//recollage des différent buffer
return buffer_recoller;
}

Enfin, c'est du langage "algorithmique", si tu vois ce que je te suggère. Mais ça ne fonctionne peut être pas. Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur

Répondre à Char Snipeur

4

Lit seulement jusqu'a '00', le 17 mar 2009 à 08:42:27

Moi je ne fonctionne pas caractère par caractère.

Dans mon readFile je lui indique qu'il doit lire 11 Octets ( C'est plus simple de cette manière pour la suite de mon code)

Il me le fait bien en temps normal, sauf s'il il rencontre 00, alors la sera la fin de la lecture.

Répondre à Lit seulement jusqu'a '00'

5

Lit seulement jusqu'a '00', le 17 mar 2009 à 09:18:44

J'ai compris partiellement pourquoi ma chaine se terminait au 00.

Mon buffer est de type char Rx[12].

Char est donc une chaine AZT ( A Zéro Terminal ), de ce fait, la lecture de ma trame se fait bien entièrement mais mon buffer lui s'arretera à se Zéro terminal (principe des chaine AZT:

Ex : Lecture = 12 48 94 75 00 48 97 53 20 15 FF
mais BufferRx = 12 48 94 75 00 <-- (zéro terminal)

Comment puis-je contourné le problème alor que readfile me demande un buffer de type Char ??

Répondre à Lit seulement jusqu'a '00'

6

Char Snipeur, le 17 mar 2009 à 09:40:51

Salut.
Je ne sais pas où tu as été péché ça. char est un type entier comme un autre qui n'es interprété en caractère que par certaines fonction.
Donne ton code source, mais il n'y a pas de raison pour que ça fasse ce que tu dit.
Je ne te dit pas de fonctionner caractère par caratère, mais de relancer le readFile() si tu rencontre 00.
Enfin bon, si tu ne veux pas de conseil, j'arrête là. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

7

Lit seulement jusqu'a '00', le 17 mar 2009 à 09:49:20

J'ai pêché sa dans mes cours! révise tes chaines de caractère.

Je n'ai jamais dit que je ne voulais pas de conseil!

Mais si tu veux t'arreter la je t'en prie, je vais poursuivre ma recherche dans d'autre forum plus compétent.

Répondre à Lit seulement jusqu'a '00'

8

Char Snipeur, le 17 mar 2009 à 10:12:21

N'accuse pas d'incompétence les gens qui en savent plus que toi (surtout que tu parles encore de "cours").
char* est une AZT comme tu dit à partir du moment où on la considère en temps que telle. Du point de vue informatique, il s'agît d'un type comme un autre, et la terminaison d'une chaîne par 00 n'est qu'une convention qui s'applique lorsque la chaîne de type char est interprété/considérer comme une chaîne de caractère.
Le problème c'est qu'il est possible que readfile() considère qu'il doit lire une chaîne de caractère (je ne connais pas cette fonction, c'est une supposition) il est alors logique qu'il s'arrête en lisant 00 sur le buffer du COM.
Changer le type passé à la fonction ne servira strictement à RIEN.
Le problème, ou un similaire, se produit avec std::cin, ou les fonction gets associés : le buffer n'est lu que jusqu'à un certain niveau et s'arrête si il rencontre une espace ou un saut de ligne, il faut alors relancer la lecture pour avoir le nombre de donnés lues souhaité.
Attention, quand je parle de buffer, je parle d'un espace mémoire qui ne t'es pas directement accessible où sont stocké les valeurs provenant du port COM.
Il est aussi possible que la fonction considère le flux comme un flux de caractère, ça peut dépendre de la façon d'ouvrir le flux. Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur

Répondre à Char Snipeur

9

Lit seulement jusqu'a '00', le 17 mar 2009 à 10:23:01

Oui je parle encore de cours puisque je n'ai pas fini mes études, mais franchement je n'ai pas compris ta réaction! :o

Bref,

Oui j'ai vu quelque part qu'il fallait ouvrir le flux série en mode binaire et non pas en mode caractère.
Mais je ne vois pas comment procéder.

ReadFile() est une fonction de L'API32 pour ouvrir les flux vers les fichiers ( Le port Série sous Win etant considéré comme un fichier)

Mais j'ai bien peur qu'il ne puisse interprêter que le mode caractère.

Pour info, je lit mon port série jusqu'à FF (comme indiqué ci dessus) seul les problèmes viennent quand j'ai un octet à 00.
C'est pour cela que j'ai penser qu'il s'agissait d'une confusion avec le Zero terminal.

Répondre à Lit seulement jusqu'a '00'

11

loupius, le 17 mar 2009 à 14:44:26

Moi, j'ai bien compris sa réaction. Il ne fallait pas mettre d'huile sur le feu !
Quand tu as un octet à zéro, t'es-tu assuré que les autres octets n'avaient pas été mis dans le buffer? Comme l'a expliqué Char Snipeur, char* pointeur peut être considéré en tant que chaîne de caractères avec un caractère de terminaison (0), ou bien, et même d'abord, comme un tableau (ou buffer) de 11 caractères. Si ta fonction 'ReadFile' considère un buffer de 11 caractères, il les remplira même s'il y a des zéros et ainsi tu vas pouvoir lire ces 11 caractères, par exemple:

for (int i=0; i<11; i++)
  printf ("%X ", pointeur[i]);
Si ta fonction 'ReadFile' s'arrête lorsqu'elle rencontre un '0', alors il faut effectivement la réécrire.
Mais moi, comme Char Snipeur, je ne suis pas très copain-copain avec la MFC; je ne puis d'aider plus.

Répondre à loupius

12

weilbs, le 3 sep 2009 à 12:47:46

Bonjour,

Je suis confronté au même problème que toi. Je reçois une trame en Hexa et j'aimerai la mettre dans un fichier, or je ne trouve dans mon fichier qu'une petite partie puisque il rencontre un 00.

As tu trouvé une solution?

merci de me répondre.

weilbs@hotmail.fr

Répondre à weilbs

10

Char Snipeur, le 17 mar 2009 à 10:52:41

J'ai trouvé ça : http://msdn.microsoft.com/en-us/library/aa365467(VS.85).aspx­
Moi et l'API windows ça fait deux, je trouve que c'est une belle implémentation de "pourquoi faire simple quand on peut faire compliqué".
Bon, essayons d'avancé sur ton problème.
Pour info, je lit mon port série jusqu'à FF (comme indiqué ci dessus) Comment le sais tu ?
seul les problèmes viennent quand j'ai un octet à 00. Comment sais tu que le reste de la trame n'est pas rempli.
Pour l'ouverture en mode binaire, il faut se reporter à la documentation de la fonction d'ouverture.
Pour y voir plus clair mets le bout de code qui pose problème, histoire d'avoir un truc plus concret. Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur

Répondre à Char Snipeur

15

 Abdallah, le 9 nov 2009 à 00:13:53

Bonjour,

Concernant ce que tu dis,
La lecture s'arrete lorsque tu recois 00, au lieu de FF,

et bien c'est simple tu n'as qu'a complementer la valeur de l'ctet recu!
puis avant de l'utiliser dans ton traitement, tu le recomplemente!

de mes souvenir en c/c++ l'operateur de complémentation c'est (~ (valeur de l'octet recu) )

Amicalement,

Répondre à Abdallah