Envoi de données hexadécimales via une communication de port série sous Linux

J’ai la tâche d’envoyer des données hexadécimales à mon COMPORT sous Linux. J’ai écrit ce code C simple, mais il n’envoie qu’un nombre décimal. Quelqu’un peut-il m’aider à envoyer un bit hexadécimal?

Voici le code que j’ai écrit

#include  /* Standard input/output definitions */ #include  /* Ssortingng function definitions */ #include  /* UNIX standard function definitions */ #include  /* File control definitions */ #include  /* Error number definitions */ #include  /* POSIX terminal control definitions */ int number,n; void main(void){ open_port(); } int open_port(void) { int fd; /* File descriptor for the port */ fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("open_port: Unable to open /dev/ttyACM0 - "); } else{ printf("Port Opened successfully\n"); number = 1; while(number!=55){ scanf("%d",&number); n = write(fd, "ATZ\r", number); if (n < 0) fputs("write() of 4 bytes failed!\n", stderr); } } return (fd); } 

S’il vous plaît aider

Merci d’avance 🙂 🙂

write est défini comme:

  ssize_t write(int fd, const void *buf, size_t count); 

C’est-à-dire qu’il envoie count octets à fd depuis buf . Dans votre cas, les données sont toujours la chaîne “AZTR \ r”, plus les données non définies par la suite (si nombre est> 5). Votre programme n’envoie ni données hexadécimales ni décimales.

Voulez-vous envoyer des données binarys ou une chaîne de caractères hexadécimaux ?

Pour la première option, vous pouvez utiliser: write(fd, somebuffer, len); , où une mémoire tampon est un pointeur sur n’importe quel jeu d’octets (y compris les entiers, etc.).

Pour l’option deux, convertissez d’abord vos données en une chaîne hexadécimale en utilisant sprintf avec %02X tant que chaîne de format, puis write ces données sur le port.

Il y a plusieurs problèmes avec le code:

  • Le texte lu à partir de la console est interprété en tant que décimal ( "%d" ); si vous voulez qu’il soit interprété en hexadécimal, utilisez "%x" .
  • Le write() est pathologique. Le troisième argument est le nombre d’octets à écrire, pas la valeur. Il devrait être soit

    n = écrire (fd, “ATZ \ r”, 4); // il y a 4 octets à écrire pour initier le modem

ou

 char buf[10]; n = sprintf (buf, "%x", number); // convert to hex n = write (fd, buf, n); // send hex number out port 

Cette fonction prendra une chaîne hexadécimale et la convertira en binary, ce que vous voulez réellement envoyer. la représentation hexadécimale est destinée à permettre aux humains de comprendre ce qui est envoyé, mais quel que soit le périphérique avec lequel vous communiquez, vous aurez probablement besoin des valeurs binarys réelles.

 // Converts a hex representation to binary using strtol() unsigned char *unhex(char *src) { unsigned char *out = malloc(strlen(src)/2); char buf[3] = {0}; unsigned char *dst = out; while (*src) { buf[0] = src[0]; buf[1] = src[1]; *dst = strtol(buf, 0, 16); dst++; src += 2; } return out; }