Forum Programmation.c Envoi des commandes en HEXA au port Usbserial (/dev/ttyUSB0)

Posté par  .
Étiquettes : aucune
1
14
déc.
2009
Bonjour,

j'utilise un logiciel qui communique avec le port COM sur Linux en envoyant et recevoir un ensembles de messages.

Pour tracer les messages, j'utilise un sniffer qui me donne les messages envoyés et reçus au port en HEXA.

Ce que je cherche, c'est renvoyer la même séquence de messages mais sous Linux, à l'aide d'un petit programme en C qui ouvre le port série /dev/ttyUSB0 et écrit sur lui.

Mon problème c'est comment écrire sur le port les messages en HEXA, en utilisant la fonction write?
ou si c'est possible avec un echo sur le périphérique directement?

NB: un message peut être comme ceci: 020400FFFF010000004

Merci
  • # pas en hexa mais repris d'un code pour lire dans un GPS en serie ou USB

    Posté par  . Évalué à 3.

    Hexa ou pas si tu connais la longueur de la chaine à envoyer/recuperer ca doit pouvoir se faire tres simplement.

    voici le code extrait d'un programme pour gerer certains gps via port serie ou convertisseur usb/serie

    #include <fcntl.h>
    #include <sys/select.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <termios.h>
    #include <unistd.h>

    #ifndef DEVICE
    #define DEVICE "/dev/ttyS0"
    #endif

    // ouverture
    device = DEVICE;
    fd = open(device, O_NOCTTY | O_NONBLOCK | O_RDWR);
    if (fd == -1)
    error("open: %s: %s", device, strerror(errno));
    if (tcflush(fd, TCIOFLUSH) == -1)
    error("tcflush: %s: %s", device, strerror(errno));

    [...]
    // lecture
    int n;
    do {
    n = read(fd, buf, sizeof(buf));
    } while (n == -1 && errno == EINTR);
    if (n == -1)
    DIE("read", errno);
    else if (n == 0)
    DIE("read", 0);

    [...]
    // ecriture
    int rc;
    do {
    rc = write(fd, buf, len);
    } while (rc == -1 && errno == EINTR);
    if (rc == -1)
    DIE("write", errno);

    // fermeture
    if (close(fd) == -1)
    DIE("close", errno);


  • # Serial programming howto

    Posté par  . Évalué à 2.

    Tout est dans le titre. C'est ce que j'avais utilisé pour écrire un petit programme similaire pour tester une montre Suunto (pour info, je ne suis pas programmeur, donc si ça m'avais suffit...).
    Ex en français : http://www.ibiblio.org/pub/linux/docs/HOWTO/translations/fr/(...)
  • # En bash

    Posté par  . Évalué à 2.

    La commande echo de bash gère l'hexadécimal directement (l'echo de base ne sait faire que de l'octal), donc ton message peut être envoyé comme ça (il manque un morceau d'ailleurs) :

    echo -ne "\x02\x04\x00\xFF\xFF\x01\x00\x00\x00..." > /dev/ttyUSB0


    Pour configurer un port série, la commande c'est stty, voir le man pour les détails.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.