IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

lecture port série


Sujet :

C++

  1. #1
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut lecture port série
    Bonjour,

    j'écris une petite application qui utilise le port série, mais je rencontre un problème pour la lecture de celui-ci, en effet avec le code que j'utilise je ne reçoit qu'un seul caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void connect_serie::readMessage(char *buffer, unsigned int sizeMax)
    {
        printf("Size : %d \n", size);
        int ret = read(fd, buffer, size);
        if (ret < 0)
        {
            perror("Error while reading");
        }
        printf("Bytes read %d :\n", ret);
    }
    Pourtant d'après la documentation la méthode read demande bien le pointeur de fichier, le buffer, et la taille... Je ne comprend pas pourquoi il ne lit que le premier caractère puis s'arrête.

    Voici la configuration du port série :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // Configure port params.
        deviceConfig.c_cflag &= ~PARENB; // parity off
        deviceConfig.c_cflag &= ~PARODD;
        deviceConfig.c_cflag |= CSTOPB; // 2 stop bit.
        deviceConfig.c_cflag &= ~CSIZE; // Reset data size.
        deviceConfig.c_cflag |= CS8; // 8 data bits.
        deviceConfig.c_iflag &= ~(IXON | IXOFF | IXANY); //Disable software flow control.
     
        // Set port speed.
        cfsetispeed(&deviceConfig, B9600);
        cfsetospeed(&deviceConfig, B9600);
    J'ai contourné le problème avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void connect_serie::readMessage(char *buffer, unsigned int sizeMax)
    {
     
        int i;
        int ret = 0 ;
        for ( i= 0; i < sizeMax;i++)
        {
            ret += read(fd, &buffer[i], 1);
        }
        printf("Bytes read %d :\n", ret);
    }
    Mais je trouve la solution peu élégante.

    Dernièrement existe t-il une méthode pour lire tout le buffer d'entré ? Car je ne sais pas forcément le nombre de caractères que je reçoit sur le port série ?

    Merci de votre aide

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Finalement la solution est élégante

    Lire caractère par caractère à des avantages, et je pense que le faite que je ne lisait qu'un seul caractère était du au faite que je lisais avant la réception des autres caractères.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    N'est-ce qu'une erreur de copie, ou ton code qui ne fonctionnait pas utilisait effecticvement la variable size

    Il n'est pas exclu que size existe bel et bien dans la classe connect_serie, auquel cas, il faut savoir que ce sera cette valeur peut ne pas du tout correspondre à la taille du message à lire

    De plus, s'il n'y a pas d'erreur de copie, un compilateur t'aurais sans doute mis sur la voie en t'indiquant que l'argument sizeMax est défini mais jamais utilisé...
    j'aurais donc, personnellement, écrit quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void connect_serie::readMessage(char *buffer, unsigned int sizeMax)
    {
        printf("max size to read : %d \n", sizeMax);
        int ret = read(fd, buffer, sizeMax);
        if (ret < 0)
        {
            perror("Error while reading");
        }
        pri
    ntf("Bytes read %d :\n", ret);
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Oui je suppose que c'était une erreur de copie-coller lorsque je faisais mes tests...

    En faite j'avais un buffer avant et j'aurai voulu lire le tout d'un coup, mais comme il s'agissait d'un adaptateur USB je pense que le problème pouvais venir de la.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture port série
    Par mickael.be dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/07/2008, 09h49
  2. lecture port série
    Par biscot19 dans le forum C
    Réponses: 6
    Dernier message: 13/07/2007, 08h54
  3. lecture port série
    Par alex2395 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/03/2007, 15h59
  4. [API Win32 sans MFC] Lecture port série: thread bloqué
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/05/2006, 13h34
  5. Pb de lecture port série
    Par amalis dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 18/03/2006, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo