[C++] Lire une trame hexa avec Readfile

Fermé
Lit seulement jusqu'a '00' - 16 mars 2009 à 14:16
kingkouka Messages postés 1 Date d'inscription jeudi 29 avril 2010 Statut Membre Dernière intervention 29 avril 2010 - 29 avril 2010 à 16:14
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
A voir également:

10 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 mars 2009 à 16:26
Salut.
Tu peux créer ta propre fonction readfile qui lit la trame jusqu'à obtenir le FF final.
Une fonction readCom() faisant appel à readFile().
0
Au lieu de répondre n'importe quoi, abstiens-toi.
Merci.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297 > Henri
4 sept. 2009 à 11:57
Au lieu de toujours tout critiquer sans rien apporter, aide un peu.
Merci.
0
Lit seulement jusqu'a '00'
17 mars 2009 à 08:12
Je ne vois pas ou c'a m'aide?!!
j'utiliseré toujours ReadFile et mon problème reste le même!

:o
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 mars 2009 à 08:27
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.
0
Lit seulement jusqu'a '00'
17 mars 2009 à 08:42
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.
0

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

Posez votre question
Lit seulement jusqu'a '00'
17 mars 2009 à 09:18
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 ??
0
kingkouka Messages postés 1 Date d'inscription jeudi 29 avril 2010 Statut Membre Dernière intervention 29 avril 2010
29 avril 2010 à 16:14
je cherche ce genre de code, pour lire sur le port COM des données venant d'un appareil..

peux tu me fournir ton code à l'adresse: kingkouka2006@yahoo.fr

merci
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 mars 2009 à 09:40
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à.
0
Lit seulement jusqu'a '00'
17 mars 2009 à 09:49
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.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 mars 2009 à 10:12
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.
0
Lit seulement jusqu'a '00'
17 mars 2009 à 10:23
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.
0
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.
0
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 mars 2009 à 10:52
J'ai trouvé ça : https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile?redirectedfrom=MSDN
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.
0
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,
0