LabWindows/CVI

cancel
Showing results for 
Search instead for 
Did you mean: 

Envoyer / Recevoir des chaînes en hexa contenant des caractères de fin de chaîne '\x00'

Bonjour à tous,

 

Je souhaite utiliser CVI pour développer un driver d'instrument (controleur moteur), en com TCPIP à l'aide des fonctions VISA.

 

Les ordres à envoyer résident en une suite d'octets au format Hexadécimal.

Par exemple, l'envoi de la trame suivante me permet de lire la position actuelle du moteur : (0x) 00 04 00 00 54 04

 

 

viWrite (viSession, "\x00\x04\x00\x00\x54\x04");

 

Puis je fais le Read, j'attends la trame de 10 octets suivante : (0x) 00 08 00 00 54 04 90 5F 01

viRead  (viSession, 10, viBuf (Buf), &byteCnt)

Donc la chaine Buf est vide, car le premier caractère de la trame.............. est un '\0' 

Quand je vais consulter les données en mémoire, la totalité de la trame est bien présente, mais je ne sais pas comment l'exploiter.

 

Quelle est la commande magique pour récupérer toute ma trame Hexa ?

 

J'ai déjà essayé pas mal de choses, mais sans succès (du ViScanf par exemple, mais je ne suis pas expert en Format Word Smiley Tongue )

 

Help me please !! là, je sèche

Arnaud

0 Kudos
Message 1 of 4
(4,478 Views)

Sorry, my French is not  good enough to write in French.

Any function that follows the convention  that \0 is end of string ( like ViScanf() )  isn't suitable.

To access single bytes you could use the array notation (i.e.  Buf[0]).

To extract a number from your data you could use memcpy(). I.e. if your  documentation says: there is a 32 bit ( 4 bytes) signed int number beginning at the third byte, something like 

int i;

....

memcpy(&i,&Buf[2], 4)

 

could do the trick

 

 

 

0 Kudos
Message 2 of 4
(4,427 Views)

Sorry, my French is not  good enough to reply in French.

Any function that follows the convention  that \0 is end of string ( like ViScanf() )  isn't suitable.

To access single bytes you could use the array notation (i.e.  Buf[0]).

To extract a number from your data you could use memcpy(). I.e. if your  documentation says: there is a 32 bit ( 4 bytes) signed int number beginning at the third byte, something like 

int i;

....

memcpy(&i,&Buf[2], 4)

 

could do the trick

 

 

 

Message 3 of 4
(4,426 Views)

Thanks for your answer mkossmann, this is it !!!

 

I get each byte in an int array with memcpy.

So I have to order it now cause LSB et MSB are inverted,  90 5F 01  is in fact   01 5F 90  (=90000 decimal value, what I'm interested for).

 

Many Thanks (and sorry for the french)

0 Kudos
Message 4 of 4
(4,397 Views)