Problème converson d'hexa vers char

Problème converson d'hexa vers char - C - Programmation

Marsh Posté le 17-03-2006 à 15:01:42    

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:

Reply

Marsh Posté le 17-03-2006 à 15:01:42   

Reply

Marsh Posté le 17-03-2006 à 15:09:33    

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
Reply

Marsh Posté le 17-03-2006 à 15:12:49    

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
Reply

Marsh Posté le 17-03-2006 à 15:13:58    

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

Reply

Marsh Posté le 17-03-2006 à 15:19:22    

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
Reply

Marsh Posté le 17-03-2006 à 15:40:04    

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".
 

Reply

Marsh Posté le 17-03-2006 à 15:48:23    

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/
Reply

Marsh Posté le 17-03-2006 à 16:11:36    

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

Reply

Marsh Posté le 17-03-2006 à 16:12:09    

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

Reply

Marsh Posté le 27-03-2006 à 21:21:15    

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:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed