Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1756 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Problème converson d'hexa vers char

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème converson d'hexa vers char

n°1327384
Sk0r
Posté le 17-03-2006 à 15:01:42  profilanswer
 

Bonjour à toutes et à tous,
 
Voila je vous présente mon problème: je doit envoyer des trames de commandes à un robot via une liaison série RS232 classique sous Linux. A la fin de chaque trame, les caractères <SP> et <LF> (Saut de ligne) de la table ASCII doivent être absolument présent pour la valider. Seulement, au contraire de <SP>, il n'existe aucun équivalent du caractère <LF> en C, j'ai donc du effectué un "sprintf()" pour convertir sa valeur héxadécimal en caractère.
Tout se compile à merveille mais malheureusement, le résultat n'est pas celui escompté :cry: .  
Si vous pouviez jeter un oeil à mon code et me dire ce qui ne va pas cela m'aiderais énormement :) .
 
J'imagine bien que ma question est digne d'un newbie mais cela fait 2-3 jours que j'essaye toute les combinaisons possibles et je n'ai plus beaucoup de temps à consacrer à cette partie de mon programme :sweat:  
 

Code :
  1. void formaterCommande(int fd, char membre, int valeur, int vitesse)
  2. {
  3. /*Taille des chaines*/
  4. int lgCtrl;
  5. int lgPos;
  6. /*Chaines de destinations*/
  7. char commande[20] ;
  8. char controle[3];
  9. /*Conversion*/
  10. lgPos = sprintf(commande, "%c%d:%d", membre, valeur, vitesse);
  11. lgCtrl = sprintf(controle, "%c%c", "0x20", "0x0A" );
  12. /*Affichage de test*/
  13. write(1,"Write: ", sizeof("Write: " ));
  14. write(1, commande, lgPos);
  15. write(1, controle, lgCtrl);
  16. }


 
Resultats d'execution:

Code :
  1. # ./test Write: B0:0ȱWrite: C67:0ȱWrite: E38:0ȱWrite: T0:0ȱWrite: R0:0ȱ


 
 
Merci d'avance pour tout renseignement ou lien susceptible de me débloquer et désolé si une réponse à déja été posté sur le forum à ce propos, je n'ai pas su la trouver.
Je suis pret à changer de méthodes si vous pouvez m'en proposer une autre qui marcherais mieux mais sachez toutefois que je doit absolument utiliser la fonction write() pour envoyer la trame (en tous cas je n'en voit pas d'autre en C bas niveau Unixoïde).
 
Encore merci d'avance pour toute réponse.
 :jap:

mood
Publicité
Posté le 17-03-2006 à 15:01:42  profilanswer
 

n°1327387
franceso
Posté le 17-03-2006 à 15:09:33  profilanswer
 

Citation :

Code :
  1. lgCtrl = sprintf(controle, "%c%c", "0x20", "0x0A" );



cette ligne ne te donne pas de warning à la compilation ?
 
"0x20" n'est pas un caractère, mais une chaîne de caractères.
Essaie plutôt

Code :
  1. lgCtrl = sprintf(controle, "%c%c", 0x20, 0x0A);


Message édité par franceso le 17-03-2006 à 15:13:38
n°1327391
franceso
Posté le 17-03-2006 à 15:12:49  profilanswer
 

Citation :

Seulement, au contraire de <SP>, il n'existe aucun équivalent du caractère <LF> en C

:spamafote: il me semble que '\n' fait l'affaire, non ?
 
[EDIT] Au fait, c'est pour quoi ce robot ?


Message édité par franceso le 17-03-2006 à 15:14:58
n°1327392
red factio​n
Posté le 17-03-2006 à 15:13:58  profilanswer
 

oui ca doit etre ca
la il affichait l'adresse de la chaine, d'ou le 0ȱ

n°1327396
Sk0r
Posté le 17-03-2006 à 15:19:22  profilanswer
 

C'est déja un peu mieux mais pas tout à fait ca, mème en augmentant la taille de la chaine de destination:

Citation :


# ./test Write: B0:0
Write: C67:0
Write: E38:0
Write: T0:0
Write: R0:0


 
Il me faut un saut de ligne SANS retour chariot, or il est effectué durant l'execution.  
Est-ce un défaut de la console linux? De la fonction write()? ou est-ce "sprintf()" qui n'est pas adapté?
J'aimerais ton avis, merci beaucoup.
En tout cas, merci pour le tuyau sur le <SP>, je ne suis pas très bon dans tout ce qui est manipulation de caractères et tout le toutim :sweat:
 
EDIT: il s'agit d'un bras manipulateur (Hercule 2000) quand à \n cela marche effectivement.....1 fois sur 4, la bestiole ne doit pas apprecier le <CR> :(


Message édité par Sk0r le 17-03-2006 à 15:21:09
n°1327408
franceso
Posté le 17-03-2006 à 15:40:04  profilanswer
 

write n'écrit rien de plus que ce que  tu lui donnes dans ton tableau de caractères. Si tu veux t'en convaincre, tu peux envoyer la sortie de ton processus à od pour qu'il te dumpe tout

> ./test | od -cx


En regardant simplement la sortie sur ton terminal, tu ne peux pas faire la différence entre "\n" tout seul et "\r\n".
 

n°1327414
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-03-2006 à 15:48:23  profilanswer
 

Sk0r a écrit :

Voila je vous présente mon problème: je doit envoyer des trames de commandes à un robot via une liaison série RS232 classique sous Linux. A la fin de chaque trame, les caractères <SP> et <LF> (Saut de ligne) de la table ASCII doivent être absolument présent pour la valider. Seulement, au contraire de <SP>, il n'existe aucun équivalent du caractère <LF> en C,  


:heink: C'est '\n' à condition que le flux soit binaire et non texte.

Code :
  1. lgCtrl = sprintf(controle, " %c", 0x0A);


ou

Code :
  1. lgCtrl = sprintf(controle, " \n" );


Message édité par Emmanuel Delahaye le 17-03-2006 à 15:50:23

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1327429
Sk0r
Posté le 17-03-2006 à 16:11:36  profilanswer
 

Merci pour vos réponses, je vais essayer tout ça et je mettrais les résultats tout à l'heure  :jap:  
 
Merci encore :)

n°1327431
Taz
bisounours-codeur
Posté le 17-03-2006 à 16:12:09  profilanswer
 

\x20\x0A ça te plait pas mieux que des faire des sprintf pour rien ?

n°1333131
Sk0r
Posté le 27-03-2006 à 21:21:15  profilanswer
 

Bonsoir,
 
Désolé de faire remonter ce topic mais j'ai réussi à faire marcher ce satané robot en partie grace à vos renseignements et j'aimerais faire part de mon code à la communauté, en esperant que cela aidera quelqu'un dans la même situation que moi.
 
Comme conseillé par Taz, j'ai abandonné les sprintf() pour implémenter les caractères de controle tout en changeant ma méthode d'envoi de commande. C'est plus laid, surement moins efficace au niveau du temps d'execution mais ca marche:
 

Code :
  1. char SP = 0x20
  2. char LF = 0x0A
  3. void envoyerCommande(int fd, char* prefixeArticulation, float angleDeDeplacement, int vitesse)
  4. {
  5. char tabAngle[4];
  6. char tabVitesse[2];
  7. sprintf(tabAngle, "%0.1f", angleDeDeplacement);
  8. sprintf(tabVitesse, "%d", vitesse);
  9. /*Envoi de la commande*/
  10. /*Initiale de l'articulation à deplacer*/
  11. write(fd, prefixeArticulation, 1);
  12. tcdrain(fd); /*Bibli "termios.h" - Attente envoi caractères*/
  13. /*Angle de rotation*/
  14. write(fd, tabAngle, 4);
  15. tcdrain(fd);
  16. /*Séparateur angle/vitesse*/
  17. write(fd, ":", 3);
  18. tcdrain(fd);
  19. /*Vitesse*/
  20. write(fd, tabVitesse, 2);
  21. tcdrain(fd);
  22. /*Espace*/
  23. write(fd, SP, 1);
  24. tcdrain(fd);
  25. /*Saut de ligne*/
  26. write(fd, LF, 1);
  27. tcdrain(fd);
  28. }


 
 
Voili, voilou, je viens de ré-écrire le code à l'instant en 5 minutes donc il se peut que j'ai oublié 2-3 trucs voir fait des erreurs, je vérifierait demain matin :)
 
Encore merci à tous pour votre aide et votre promptitude à répondre à ma demande :jap:  
 
 
 :hello:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Problème converson d'hexa vers char

 

Sujets relatifs
Problème opengl et cpp managedProblème sur mon site
probleme avec DataSource [Resolu][résolu] newsletter : problème à l'envoi
Online.net et php grumblll... [PROBLEME RESOLU]sql vers excel
[HTML] [PHP] problème d'affichage dans une frameProblème lien PHP
Problème avec mkdir et upload[JavaScript] Problème avec un petit script
Plus de sujets relatifs à : Problème converson d'hexa vers char


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR