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

Administration système Discussion :

Comportement d'un read en embarqué ?


Sujet :

Administration système

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut Comportement d'un read en embarqué ?
    Bonjour,

    J'ai développé un programme avec "termios.h" lisant mon port série.
    J'utilise donc un read pour faire la lecture du port.

    J'ai développer 2 variantes, une 1ère qui lit 13 caractères d’un coup (correspond à la taille actuel des trames qui passe dans mon port série) et qui fait correctement ce que je cherche. Cependant cette 1ère version ne me satisfait pas car elle n'est pas dynamique du fait que je force la lecture à 13 caractères. Cela peut poser problème si la taille des trames que je lit sur le port série change, car le programme ne marchera plus.

    J'ai alors développé un second programme qui lit cette fois-ci caractère par caractère. Cela est effectué dans une boucle while qui boucle jusqu'à la lecture d'un caractère \n (dernier caractère d’une trame, c’est donc dynamique la taille de la trame peut changer sans pb). Lorsqu'elle lit se caractère, la boucle s'arette le buffer est réinitialisé et on peut recommence la boucle avec le read qui se remet en attente de reception d’une nouvelle trame.

    Ces 2 programmes fonctionne très bien sur ma machine de développement, une distribution debian. Mais le hic, c’est que les progs sont destiné à l’embarqué, je les recompile donc pour un processeur arm. Une fois installer dans le module embarqué à base de processeur arm, le 1er programme fonctionne mais le 2ème plante.

    En fait dans le premier cas la lecture des 13 caractères s’effectue bien, mais dans le second cas mon programme ne sort jamais de la boucle while attendant un \n, pour la simple et bonne raison que mon read lit en permanence le 1er caractère d’une trame. Si il y a 13 caractère qui arrive d’un coup le read ne lira tjs que le 1er alors que le même programme sur ma machine de développement boucler bien sur les 13 caractères. Je suppose donc que le read ne se comporte pas de la même façon sur le module embarqué, apparemment il ne bufferise pas les caractère.

    Avez vous une idée, faut t’il utiliser le read différemment, ou bien faut t’il utiliser une autre fonction que le read ?

    Voici pour info mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    int main () { 
      int fd,n;
      int i,j,num_int,somme,CRC_calc,CRC_lu;
      char recup_port[20],num_str[20];
      char c;
     
      /* Ouverture de la liaison série */
      fd = open(PORT, O_RDWR | O_NOCTTY);
      if &#40;fd <0&#41; &#123;perror&#40;PORT&#41;; exit&#40;-1&#41;; &#125; 
     
      /* Lecture des parametres courants */
      tcgetattr&#40;fd,&termios_p&#41;;
      /* On ignore les BREAK et les caracteres avec erreurs de parite */
      termios_p.c_iflag = IGNBRK | IGNPAR;
      /* Pas de mode de sortie particulier */
      termios_p.c_oflag = 0;
      /* Liaison a 9600 bps avec 8 bits de donnees et une parite paire */
      termios_p.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
      /* Mode non-canonique avec echo */
      termios_p.c_lflag = ECHO;
      /* Caractères immediatement disponibles */
      termios_p.c_cc&#91;VMIN&#93; = 1;
      termios_p.c_cc&#91;VTIME&#93; = 0;
      /* Sauvegarde des nouveaux parametres */
      tcsetattr&#40;fd,TCSANOW,&termios_p&#41;;
     
      /* Boucle de lecture du port */
      while&#40;1&#41;&#123; 
        /* Vide le buffer */
        tcflush&#40;fd, TCIFLUSH&#41;;
     
        /* Initialise le caractère et le compteur de caractère */
        c='\0';
        i=0;
     
        while&#40;c!=0x0a&#41;&#123;   // boucle jusqu'à la lecture de \n
          /* Récupère un caractère */
          n=read&#40;fd, &c, 1&#41;;     
          printf&#40;"%c\n",c&#41;;       
          /* Concatène le caractère dans le string recup_port */
          recup_port&#91;i&#93;=c;
          i++;      
        &#125;
      &#125;
    &#125;
    merci d'avance !

  2. #2
    Membre confirmé
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Points : 497
    Points
    497
    Par défaut
    la reponse est dans la question le read soft de ton module hard n'utilise pas le buffer.
    donc là à priori tu est coincé....

    la cross-compil c'est bien mais il faut tout de même tenir compte des spec hardware du module sur lequel tu va envoyer ton programme ...


    tu peux peut etre lire en bloc de taille fixe -> dans un tableau et lire dans le tableau tous les caracteres jusqu"au premier \n sans tenir compte du reste.

    C'est pas tres propre si tu programme pour PC mais pour de l'embarque ça se fait ce genre de choses pour les protocoles à longueurs de trames variables.

    Par exemple tu peux recevoir 3 type de trames
    8c+\n
    12c+\n
    18c+\n
    il te faut alors un tableau de 19c

    et contrairement aux apparence tu ne perds pas en performances puisque tu ne lit que les X caracteres precedent le \n tu ne perd donc pas de temps à balayer les cases inutiles du tableau.
    Comité de lutte contre le langage SMS sur les forums
    Veuillez écrire dans un langage compréhensible par les humains, merci.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par bster
    la reponse est dans la question le read soft de ton module hard n'utilise pas le buffer.
    donc là à priori tu est coincé....

    la cross-compil c'est bien mais il faut tout de même tenir compte des spec hardware du module sur lequel tu va envoyer ton programme ...
    Ouais c'est vrai, mais dans mon cas je n'ai pas vraiment de spec hardware pour mon module.

    Citation Envoyé par bster
    tu peux peut etre lire en bloc de taille fixe -> dans un tableau et lire dans le tableau tous les caracteres jusqu"au premier \n sans tenir compte du reste.

    C'est pas tres propre si tu programme pour PC mais pour de l'embarque ça se fait ce genre de choses pour les protocoles à longueurs de trames variables.

    Par exemple tu peux recevoir 3 type de trames
    8c+\n
    12c+\n
    18c+\n
    il te faut alors un tableau de 19c

    et contrairement aux apparence tu ne perds pas en performances puisque tu ne lit que les X caracteres precedent le \n tu ne perd donc pas de temps à balayer les cases inutiles du tableau.
    Le pb de cette solution et qu'il faut tout de même que je déclar eun nombre de caractère à lire dans la configuration du termios.

    L'avantage de lire caractère par caractère était aussi de pouvoir détecté des erreurs de lecture. je ne l'ai pa smis dans le code que j'ai communiqué ici, mais j'ai une gestion d etimeout aussi. Ce la me permet par exemple d'instaurer un timeout de 2ms entre la lecture de chaque caractère par exemple.

    Sinon il n'existe pas d'autre fonction que le read que je pourrai utiliser avec le termios et qui me permettrai donc de faire une lecture caractère par caractère avec buffer.

  4. #4
    Membre confirmé
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Points : 497
    Points
    497
    Par défaut
    là tu dépasses mes pauvres compétences en C....

    Comité de lutte contre le langage SMS sur les forums
    Veuillez écrire dans un langage compréhensible par les humains, merci.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par bster
    là tu dépasses mes pauvres compétences en C....

    Ok ok

    Merci tout de même !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Personne d'autre a une idée ?

Discussions similaires

  1. Quel langage pour le développement embarqué ?
    Par freakydoz dans le forum Débats sur le développement - Le Best Of
    Réponses: 37
    Dernier message: 23/04/2007, 20h31
  2. Comportement de read
    Par Blo0d4x3 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 01/11/2006, 17h53
  3. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 14h59
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 11h30
  5. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 16h00

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