Forum Programmation.shell gawk traitement du port serie ttyS0

Posté par  . Licence CC By‑SA.
Étiquettes :
0
23
mai
2013

bonjour

j'ai un appareil sur ttyS0 en 115200 8b 1stop qui émet des distances sous la forme :

12.25^M
13.89^M
14.89^M
15.89^M
25.87^M

mon script :
cat /dev/ttySO | dos2unix -l | gawk '{print strftime ("%F %T", -bash;}'

cela a fonctionné correctement :( quelques temps résultat attendu :

2013-05-22 12:45:26 12.25
2013-05-22 12:45:26 13.89

lorsque j'ai sauvegardé le script pour le retrouver plus tard avec la commande :
echo " cat /dev/ttySO | dos2unix -l | gawk '{print strftime ("%F %T"), -bash;}' " > log.sh

la commande dans log.sh ne fonctionnais plus, la commande ci dessus est celle sauvegardé pas la réelle.
le nouveau résultat est :
2013-05-22 12:45:26 0
2013-05-22 12:45:26 0

j'arrive a refaire fonctionner le traitement avec : gawk '{print strftime ("%F %T"); print ;}' MAIS
le résultat est :

2013-05-22 12:45:26
12.25

je peux faire un post traitement sans souci, mais je préférerais m'en passer. Une idée ?

  • # j'ai trouvé

    Posté par  . Évalué à 2. Dernière modification le 23 mai 2013 à 11:48.

    honte a moi, un simple $1 correctement placé resoud tout mes problèmes

    gawk '{print strftime ("%F %T "$1) ;}'

    par contre cela en rajoute un petit, cela utilise un buffer, ce n'est plus au fil de l'eau. je perd des données.

    • [^] # Re: j'ai trouvé

      Posté par  . Évalué à 2.

      pourquoi gawk plutot au awk ?
      je dis ca, j'ai pas été voir quelle etait la difference entre les deux.

      • [^] # Re: j'ai trouvé

        Posté par  . Évalué à 2.

        Probablement aucune sous linux. Chez moi awk est un lien symbolique vers gawk. Sur les BSD (OpenBSD en tous cas) par contre c'est bien un autre awk (je crois issue du code de Kernighan, un des créateurs d'awk), et il a pas mal de fonctionnalités en moins (pas de backreferences dans les regexp par exemple je crois).

      • [^] # Re: j'ai trouvé

        Posté par  . Évalué à 2.

        Awk n a pas strftime, seule gawk possede l option

    • [^] # Re: j'ai trouvé

      Posté par  (site web personnel) . Évalué à 3.

      Je pense que ton script original c'est :
      ~# cat /dev/ttyS0 | dos2unix -l | gawk '{print strftime("%F %T"), $1;}'
      Mais quand tu as fait ton "echo" pour le sauvegarder, bash a interprété le '$1' (d'où le -bash).

      par contre cela en rajoute un petit, cela utilise un buffer, ce n'est plus au fil de l'eau. je perd des données.

      Lapin compris.

      • [^] # Re: j'ai trouvé

        Posté par  . Évalué à 1. Dernière modification le 23 mai 2013 à 20:05.

        J ai des pauses dans le flux serie au niveau de awk, pendant ces pause les donnee arrive toujours et ne sont pas traite, bravo ! Pour avoir trouve d ou venait la modif, merci

      • [^] # Re: j'ai trouvé

        Posté par  . Évalué à 3.

        s/<1>/<0>/g/

        argv[0] est le nom du programme lancé (donc pour le bash, c'est "bash" dans la variable $0), et pour awk, $0 représente toute la ligne (tandis que $1 représente le premier champs). Comme il n'y a qu'un seul champs par ligne, $0 et $1 sont équivalents pour awk, mais pas pour le shell !

  • # simplifions nous la vie

    Posté par  . Évalué à 3.

    ton

    cat /dev/ttySO | dos2unix -l | gawk '{print strftime ("%F %T"), $1;}'
    
    

    doit pouvoir s'ecrire

    gawk '{print strftime ("%F %T"), -bash;}' /dev/ttyS0
    
    
    • [^] # Re: simplifions nous la vie

      Posté par  (site web personnel) . Évalué à 3.

      Non, parce que dans son cas il remplace les CRLF par des LF (fin de ligne DOS -> fin de ligne UNIX).
      Donc c'est pas tout à fait équivalent.
      Par contre je soupçonne que
      ~# gawk -vRS='\r\n' '{print strftime ("%F %T"), $1;}' /dev/ttyS0
      fonctionne.

      • [^] # Re: simplifions nous la vie

        Posté par  . Évalué à 4.

        en effet, j'avais oublié le dos2unix pour changer le retour chariot, et je supposais bien qu'il y avait une option à awk/gawk pour faire ca à la volée.

        on elimine alors les 2 pipes, ce qui est plus efficace.

      • [^] # Re: simplifions nous la vie

        Posté par  . Évalué à 1.

        J essaye demain, merci

      • [^] # Re: simplifions nous la vie

        Posté par  . Évalué à 3.

        étonnamment :

        gawk -vRS='\r\n' '{print strftime ("%F %T"), $1;}' /dev/ttyS0

        ne fonctionne pas, comme si gawk ne voyait qu'une ligne sans séparateur dans les log du port série mais :

        gawk '{print strftime ("%F %T"), $1;}' /dev/ttyS0

        fonctionne. Du coup je n'ai plus qu'un seul processus, merci !

        • [^] # Re: simplifions nous la vie

          Posté par  . Évalué à 4.

          parce que gawk doit savoir interpreter le ^M comme etant le retour à la ligne
          et peut donc traiter l'information

Suivre le flux des commentaires

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