LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
12 juin 2007 à 11:37
Loki6
Messages postés286Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention27 décembre 2009
-
14 juin 2007 à 11:49
salut,
j'aimerais de l'aide ou sinon au moins des précisions si possible sur un petit bout de code SVP.
Voila mon pb : je recupére une trame dans un buffer défini ainsi BYTE buffer[4000];
ma trame est composée comme ceci : STX-DATA-ETX (en tres gros)
STX et ETX sont de l'hexa correspondant a 0x02 et 0x03 respectivement.
mes données sont une suite de caractére a decomposer aussi on va dire 5caractere pour le nom suivi de 10 pr le prenom (pr exemple)
voila je ne sais pas trop comment decomposer ma trame et retirer les STX ETX et ensuite decomposer ma chaine de caracteres qui est en hexa
pr les stocker dans des variables comme cela: char prenom [10]; char nom[5];
si mon buffer originel était une chaine de caractere j'aurais pu faire : strncpy_s( nom, buffer , 5);
mais comme la mon buffer est une suite d'octets je ne sais pas comment faire l'equivalent ...
pourriez vous m'aider ou du moins me guider SVP ! merci d'avance.
Loki6
Messages postés286Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention27 décembre 20092 13 juin 2007 à 11:30
ouais c'est normal, strcmp bosse sur des chaines, pas des caractères simples.
remplace
char MsgTyp[1+1] = ""; // au fait 1+1 ca fait 2
memcpy(MsgTyp, lpBuffer, 1);
MsgTyp[1] = '\0';
if(strcmp(MsgTyp,ENQ) == 0)
par
char MsgTyp = lpBuffer[0]; // là tu attribue la valeur du premier octet de lpBuffer à ta variable
if (MsgTyp == ENQ) // là tu vérifies que la valeur de la variable est bien égale à ENQ
tu gagnes un octet (chouette!) et tu te simplifies la lecture. et en plus ça doit marcher ce qui n'est pas négligeable.
Loki6
Messages postés286Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention27 décembre 20092 13 juin 2007 à 09:34
salut,
le problème Keniiyk c'est que 5 et 10 lettres étaient des exemples. je suppose que ça doit être variable.
LaTatadu91 > il faut savoir qu'un char est codé sur un octet exactement comme un BYTE.
ensuite, ta chaine n'est ni en hexa ni en décimal ni en cacahuètes, c'est une liste de bits à 0 ou 1. après tu la lis comme tu veux.
buffer[0] est STX que tu peux stocker dans un char si besoin, de même que ETX (je ne sais pas s'il est forcément à l'adresse buffer[3999] ou bien si le texte fait par exemple 20 caractères, le ETX est à buffer[20], à vérifier donc)
pour le reste tu peux faire une copie avec strcpy.
Loki6
Messages postés286Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention27 décembre 20092 13 juin 2007 à 09:41
pour ce qui est de trier les différents champs de la partie DATA, tu as deux possibilités :
- soit pour chaque champ il n'y a qu'un seul mot, dans ce cas c'est simple : tu te places au début à buffer[1] tu récupères le mot avec sscanf(), ensuite tu dégages jusqu'au prochain espace avec strstr() etc... pour chaque champ.
- soit tu peux avoir des noms comme (Jean-Baptiste) "de la fraise tagada". à ce moment là c'est plus ch****. il faudrait que tu aies un caractère spécial comme ';' dont tu te sers pour séparer tes champs, encore faut-il pouvoir les insérer à la création de la trame...
si tu peux, alors il faut lire chaque caractère et non plus des mots (car sscanf termine la lecture d'une chaine à chaque espace rencontré), jusqu'à tomber sur ';'.
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 13 juin 2007 à 10:08
en fait mon buffer de données sera toujours composé ainsi : STX-DATA-ETX ce qui n'est pas fixe c'est : la partie DATA.
Mais les 2 premiers caracteres de DATA m'indiqueront quel type de données je dois decomposer!
ainsi suivant le type de données je peux decomposer DATA avec pr mon exmple : 5caracteres pr le nom et 10 pr le prenom...
par contre je peux aussi avoir d'autre types de messages : ENQ et ACK donc
1/ je dois definir quel type de message m'arrive avec le premier octet de ma trame (ENQ,ACK,STX)
2/suivant le type de message je dois agir :
- Si c'est ENQ --> envoi d'un ACK
- Si c'est STX --> decomposition de DATA dans mes variables (memcpy)....
donc la solution de keniiyk me semble pas mal , car effectivement pr chaque chaine de caractere de DATA je sais de combien de caractere elle se compose.
il me reste juste a identifier les types ENQ ,STX ...
en faisant cela alors :
memcpy(MsgTyp, buffer, 1);
if (strcmp(MsgTyp,STX) ==0)
....
if (strcmp(MsgTyp,ENQ) ==0)
....
en declarant STX et ENQ comme ceci :
char STX = 0x02; // start transmission marker
char ETX = 0x03; // end transmission marker
char ACK = 0x06; // Acquittement du message
char ENQ = 0x05; // Enquiry
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 13 juin 2007 à 10:23
ben a priori a toi de me le dire ...
moi j'aurai tendance a utiliser les memcpy et strcmp mais si tu me dis que c'est equivalent ben oki...
donc ma declaration des STX etc... c'est bon?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 13 juin 2007 à 10:56
lol nan mais serieux ty connais rien ou t'es un master?
moi je suis un jeune padawan qui cherche a devenir jedi
mais bon le coté obscur me guette....
il faut que je trouve yoda du coup!!!
Loki6
Messages postés286Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention27 décembre 20092 13 juin 2007 à 11:07
bah disons que je suis loin d'être novice, mais encore plus loin d'être un master.
mais pour ce qui est de la déclaration des STX etc... oui, c'est les bon numéros.