Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Profil pro said said
    Inscrit en
    août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : said said

    Informations forums :
    Inscription : août 2010
    Messages : 16
    Points : 0
    Points
    0

    Par défaut lecture du port serie

    Bonjour à tous,

    J'ai fait le programme suivant pour envoyer une ligne de commande au port serie , puis récupérer la réponse. mais malheureusement, je n'arrive pas à récupérer l'information.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include        <stdio.h>
    #include	<opencv/highgui.h>
    #include	<fcntl.h>
    
    
    int main()
    {
    int _platine;
    int entete;
         _platine = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    
          if(_platine <0)
            {       perror("Erreur d'ouverture du port serie");
                     exit(-1);
            }
          else
            {
              write(_platine,"VLIM\r",5);
              read(_platine, &entete, sizeof(entete)-1);
    
                      printf ("VLIM = %d", entete);
    
             }
    
    }
    Je récupère toujour la valeur 0, normalement je dois récuperer la valeur 2500.

  2. #2
    Membre Expert
    Avatar de Aquanum
    Homme Profil pro
    Ingénieur Linux Embarqué
    Inscrit en
    janvier 2006
    Messages
    704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Linux Embarqué
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : janvier 2006
    Messages : 704
    Points : 2 169
    Points
    2 169

    Par défaut

    Il te faudrait un peu plus de gestion d'erreur pour nous aiguiller.

    • Essaie de tester le retour des write et read. Comme ça tu vérifies que l'écriture a bien marché, et que tu lis bien le bon nombre d'octets.
    • Pourquoi lis-tu 3 octets ?
    • Tu reçois bien un int ? Pas un short ? Essaie de faire un read de char par char en affichant le résultat en hexa : "%.02X"
    • Oublie pas ton \n à la fin de ton printf
    • Oublie pas le close à la fin
    • Où as-tu réglé ton baudrate ? Ton termios est déjà configuré ?


    Un truc du genre :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    int ret;
    unsigned char c;
    
    while (1) {
        ret = read(_platine, &c, 1);
        printf("read (%d) : %.02X\n", ret, c);
    }

  3. #3
    Membre confirmé Avatar de Livegen
    Homme Profil pro
    Ingénieur logiciel embarqué Franco-allemand
    Inscrit en
    avril 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué Franco-allemand
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2008
    Messages : 70
    Points : 205
    Points
    205

    Par défaut

    meme avis que le modérateur ci-dessus.

    Après pour le read = 0, je pense que le problème vient de l option O_NDELAY lorsque tu récupères le file descriptor, le read est alors non-bloquant. En conséquence lorsque tu fais une lecture, read t indique qu il n a rien dans son buffer UART car ton périphérique ne t as pas encore répondu.

    Meilleures salutations.

  4. #4
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 677
    Points : 7 066
    Points
    7 066

    Par défaut

    Si tu essayes de lire ce que tu viens d'écrire, il me semble que ce n'est pas possible. Si j'ai bonne mémoire, j'ai lu un sujet sur Developpez où le PO voulait faire ça et quelqu'un avait répondu que écrire sur le port série donne un signal au fil TX et que le lire lit le signal du fil RX. S'ils ne sont pas reliés, il n'y a pas de raison que le signal de sortie boucle sur l'entrée.
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  5. #5
    Invité de passage
    Profil pro said said
    Inscrit en
    août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Nom : said said

    Informations forums :
    Inscription : août 2010
    Messages : 16
    Points : 0
    Points
    0

    Par défaut Vous avez raison

    Enfin j'ai trouver la solution: il me fallait déclarer buffer (entete) en tant que tableau et rajouter la fonction :
    Code :
    1
    2
    3
    char buffer[255];  /* Input buffer */
    fcntl(fd, F_SETFL, 0);
    donc mon programme final est (peut être ça va servir d'autres personnes) :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
    #include <stdio.h>   /* Standard input/output definitions */
    #include <fcntl.h>   /* File control definitions */
    
    using namespace std;
    
    int main(void)
    {
    char buffer[255];  /* Input buffer */
    
    int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
             if (fd == -1) 
               {
                    perror("open_port: Unable to open /dev/ttyS0 - ");
                    return 1;
                } 
            else 
                {
                    fcntl(fd, F_SETFL, 0);
               
                    write(fd, "VLIM\r",5);
                    read(fd, buffer, sizeof(buffer) - 1);
                    cout << buffer << endl;
    
                    close(fd);
    
                      } 
       return (0);
    }

  6. #6
    Membre Expert
    Avatar de Aquanum
    Homme Profil pro
    Ingénieur Linux Embarqué
    Inscrit en
    janvier 2006
    Messages
    704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Linux Embarqué
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : janvier 2006
    Messages : 704
    Points : 2 169
    Points
    2 169

    Par défaut

    Ravi que ça fonctionne.

    Néanmoins, je suis curieux. Je ne comprends pas trop ce qu'apporte l'appel à fcntl qui va si je ne m'abuse paramétrer ton file descriptor à 0 (O_RDONLY). En faisant ça tu écrases complètement ta configuration. Généralement, fcntl et F_SETFL est plutôt utilisé avec F_GETFL pour ne pas perdre ta configuration initiale.

    Bref, dans la mesure où tu es en O_RDWR et O_NDELAY (=O_NONBLOCK) j'ai du mal à comprendre en quoi l'appel à fcntl corrige le problème.

    Je me mettrais bien dans les mêmes conditions pour tester, mais je n'ai pas le même contexte. Si quelqu'un a une explication, je suis preneur.

    Quoi qu'il en soit, ssssa1983 si tu peux le faire, je te conseille vivement de gérer tous les cas d'erreurs. Ça n'en sera que mieux pour les potentielles prochaines erreurs.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •