Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

port serie et commande read

18 réponses
Avatar
Christophe Maquaire
Bonjour,

j'ai un onduleur qui utilise le protocole de communication par liaison
série décrit ici:

http://eu1.networkupstools.org/protocols/megatec.html

Je voudrais bien récupérer la réponse de l'onduleur à la question Q1 de
son statut dans un script.

je paramètre le port série comme ceci:

nomade:/home/christophe# stty -F /dev/ttyS0 -icanon -parenb -cstopb cs8
2400 -ocrnl icrnl

Ca fonctionne:

christophe@nomade:~$ cat /dev/ttyS0 > rep_serie &

christophe@nomade:~$ echo -ne Q1$'\r' > /dev/ttyS0
christophe@nomade:~$ echo -ne Q1$'\r' > /dev/ttyS0
christophe@nomade:~$ echo -ne Q1$'\r' > /dev/ttyS0

christophe@nomade:~$ cat rep_serie
(237.3 237.3 234.8 016 50.1 13.6 25.0 00001001
(239.3 239.3 235.5 016 50.1 13.6 25.0 00001001
(239.2 239.2 236.2 016 50.1 13.6 25.0 00001001

et je peux faire autant de demande avec un délai aussi variable que je le
souhaite, les lignes de réponse restent sans défaut.

Je me dis donc qu'un read devrait faire l'affaire et là les choses se
compliquent:

christophe@nomade:~$ echo -ne Q1$'\r' > /dev/ttyS0 ; read reponse < /\
dev/ttyS0 ; echo $reponse
(237.1 237.1 234.5 016 50.1 13.6 25.0 00001001
christophe@nomade:~$ echo -ne Q1$'\r' > /dev/ttyS0 ; read reponse < /\
dev/ttyS0 ; echo $reponse

^C (faut bien en sortir...)
Et encore la première réponse est exceptionnelle, en général aucune
réponse n'est récupérée par read.

Je lis la page man de read (qui est même pas sur ma debian...) et
j'essaie

echo -ne Q1$'\r' > /dev/ttyS0 ; read -n 46 reponse < /dev/ttyS0 ; echo \
$reponse
%��� ���r����r������r���r���r���������j

je vous passe la répétition de la commande pour laisser les sorties:

���r����r����r������r���r���r���������j
(237.1 237.1 234.5 015 50.0 13.6 25.0 00001001
J��� ���r����r������r���r���r���������j
237.0 237.1 234.5 015 50.1 13.6 25.0 00001001
���r����r����r������r���r���r���������j
I��r����r����r������r���r���r���������j
���� ���r����r������r���r���r���������j
I��r����r����r������r���r���r���������j
(237.1 237.1 234.6 016 50.0 13.6 25.0 00001001
���r����r����r������r���r���r���������j
����)���r����r������r���r���r���������j
���r����r����r������r���r���r���������j
J���)���r����r������r���r���r���������j

Bon, j'imagine donc que la lecture du port série par read "rate"
aléatoirement quelques bits en début de ligne (je crois), ce qui décale
la lecture et modifie les caractères reçus. Donc pas de <NL> (icrnl
modifie le CR reçu en NL ) en fin de lecture, donc pas de fin de
lecture...

Et là je bloque aussi, comme read...

J'aimerais bien récupérer la ligne entière à coup sûr.

Je suis donc preneur de toute idée nouvelle!

Christophe

10 réponses

1 2
Avatar
Nicolas George
Christophe Maquaire wrote in message
:
:~$ echo -ne Q1$'r' > /dev/ttyS0 ; read reponse < /
dev/ttyS0 ; echo $reponse



Tel quel, tu fermes le port série entre l'écriture de la commande et la
lecture de la réponse. Ce n'est pas bon.
Avatar
Christophe Maquaire
Le Sun, 16 Nov 2008 17:01:23 +0000, Nicolas George a écrit:


Tel quel, tu fermes le port série entre l'écriture de la commande et la
lecture de la réponse. Ce n'est pas bon.



OK et merci, mais que suggères-tu ? passer par un fichier temporaire et
en lire les lignes?

Le problème que j'ai alors, c'est que ma maîtrise du shell est
insuffisante pour lire une ligne, l'effacer dudit fichier temporaire,
sans interrompre l'écriture en tâche de fond d'un cat /dev/ttyS0.

Si tu veux bien m'aider, je peux envoyer mes ébauches ratées!

Christophe
Avatar
Nicolas George
Christophe Maquaire wrote in message
<492063e8$0$27503$:
OK et merci, mais que suggères-tu ?



Garder le file-descriptor ouvert, avec une construction du style « exec
4<>/dev/ttyS0 », ou, mieux, avec un langage plus adapté que le shell.

Si tu veux bien m'aider, je peux envoyer mes ébauches ratées!



Désolé, mais je n'ai pas trop le temps en ce moment.
Avatar
Christophe Maquaire
Le Sun, 16 Nov 2008 18:31:59 +0000, Nicolas George a écrit:

Garder le file-descriptor ouvert, avec une construction du style « exec
4<>/dev/ttyS0 », ou, mieux, avec un langage plus adapté que le shell.




Merci pour cette suggestion, je vais creuser. Je ne maîtrise déjà pas
vraiment le shell, alors autre chose...
Avatar
Thierry B.
--{ Christophe Maquaire a plopé ceci: }--

Je lis la page man de read (qui est même pas sur ma debian...) et



read est une commande internet du shell. Avec Bash tu peux faire:
$ help read

Je suis donc preneur de toute idée nouvelle!



Pour ce genre de manipulations sur des lignes séries, je
regarderais du coté de CKermit et de son langage de script.

Peut être un peu overkill, mais je pense que ça peut le
faire, le langage est assez complet. Il doit même pouvoir
remonter des alertes par le réseau...

Sinon, en plus rudimentaire, peut-être le "chat" de PPP.

--
Bah! The Interwebtubethingie will kill the internet.
Avatar
Christophe Maquaire
Le Sun, 16 Nov 2008 18:31:59 +0000, Nicolas George a écrit:


Garder le file-descriptor ouvert, avec une construction du style « exec
4<>/dev/ttyS0 »



Je viens de prendre connaissance de certaines redirections qui m'étaient
inconnues, et leurs possibilités me laissent songeur!

En tout cas un grand merci à toi, tu m'as indiqué la solution du problème
( et le problème aussi, d'ailleurs!)

christophe
Avatar
Erwan David
"Thierry B." écrivait :

--{ Christophe Maquaire a plopé ceci: }--

Je lis la page man de read (qui est même pas sur ma debian...) et



read est une commande internet du shell. Avec Bash tu peux faire:
$ help read

Je suis donc preneur de toute idée nouvelle!



Pour ce genre de manipulations sur des lignes séries, je
regarderais du coté de CKermit et de son langage de script.

Peut être un peu overkill, mais je pense que ça peut le
faire, le langage est assez complet. Il doit même pouvoir
remonter des alertes par le réseau...

Sinon, en plus rudimentaire, peut-être le "chat" de PPP.



Moi j'utiliserais plutôt expect, mais bon chacun voit avec ce qu'il connait.


--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
Christophe Maquaire
Le Sun, 16 Nov 2008 20:52:08 +0100, Thierry B. a écrit:

read est une commande internet du shell. Avec Bash tu peux faire:
$ help read



Merci, je ne connaissais pas cette documentation des commandes internes.
Ceci dit, help exec ne m'aurait pas beaucoup aidé par rapport à "mon ami"
google...


Pour ce genre de manipulations sur des lignes séries, je regarderais
du coté de CKermit et de son langage de script.

Peut être un peu overkill, mais je pense que ça peut le faire, le
langage est assez complet. Il doit même pouvoir remonter des alertes
par le réseau...




Ouille! je n'en demande pas tant, et la lecture de la documentation qui
va avec, comment dire, m'intimide peut-être...
La solution suggérée par Nicolas suffit largement à mes besoins.
Merci de ton aide
Christophe
Avatar
Thierry B.
--{ Erwan David a plopé ceci: }--


Moi j'utiliserais plutôt expect, mais bon chacun voit avec ce qu'il connait.



J'avais jamais songé à expect (que je connais très peu) pour
causer à un port série. Je vais essayer et on en reparle...


--
Oui. J'aimerais bien être assez intelligent pour pouvoir maîtrise Windows
Vista (désolé, mais XP c'est périmé). mais ce n'est pas le cas, je suis
obligé de me rabattre sur Linux.
--{ SC, in fcol.debats }--
Avatar
Fabien LE LEZ
On 16 Nov 2008 19:28:35 GMT, Christophe Maquaire :

Je ne maîtrise déjà pas
vraiment le shell, alors autre chose...



Tu sais, le shell est un langage particulièrement vicieux et
illisible. Bien des langages de programmation sont plus faciles à
comprendre.
1 2