Port série de bouclage/duplex de test, en Bash ou C? (processus de substitution)
J'ai un numéro de série de l'appareil mis en place comme de bouclage (ce qui signifie qu'il sera tout simplement un écho tout caractère qu'il reçoit), et j'aimerais pour mesurer le débit réel de la vitesse. Pour ce, j'espère que je pourrais utiliser time
, comme dans
time bash -c '...'
où " ...
" serait une commande que je puisse courir.
Maintenant, le premier problème est que je veux utiliser l'appareil à 2000000 bps, donc je ne peux pas utiliser ttylog ou écran (ils ont tous deux semblent aller jusqu'à 115200 bps seulement). Toutefois, en travaillant avec /dev/ttyUSB0
comme un fichier (en utilisant le fichier de redirection et de cat
) semble bien fonctionner:
# initialize serial port
stty 2000000 -ixon icanon </dev/ttyUSB0
# check settings
stty -a -F /dev/ttyUSB0
# in one terminal - read from serial port
while (true) do cat -A /dev/ttyUSB0 ; done
# in other terminal - write to serial port
echo "1234567890" > /dev/ttyUSB0
# back to first terminal, I now have:
# $ while (true) do cat -A /dev/ttyUSB0 ; done
# 1234567890$
# ...
Maintenant, je voudrais faire quelque chose de semblable, j'aimerais cat
un fichier à un port série, et ont du port série à lire - mais à partir d'un seul terminal de commande (afin que je puisse l'utiliser comme argument pour time
).
J'ai pensé que je pourrais utiliser un Bash processus de substitution, pour avoir le "écriture" et la "lecture" d'une partie de go, en quelque sorte, en "parallèle" - si je l'ai essayer avec des canaux nommés, il travaille:
# mkfifo my.pipe # same as below:
$ mknod my.pipe p
$ comm <(echo -e "test\ntest\ntest\n" > my.pipe) <(cat my.pipe)
test
test
test
comm: file 2 is not in sorted order
Là-haut, je ne suis pas en utilisant comm
pour tout autre but, que d' (sorte de) fusionner les deux processus en une seule commande (je suppose, j'aurais pu tout aussi bien utilisé echo
à la place).
Malheureusement, cette astuce ne semble pas fonctionner avec un port série, parce que quand je l'ai essayer, j'ai parfois:
$ comm <(echo "1234567890" > /dev/ttyUSB0) <(while (true) do cat -A /dev/ttyUSB0 ; done)
cat: /dev/ttyUSB0: Invalid argument
..., pourtant, d'habitude, j'ai juste pas de sortie que ce soit. Cela me dit que: soit il n'y a pas de contrôle de processus qui commence en premier, et ainsi de cat
peut commencer à le lire avant de le port est prêt (cependant, cela ne semble pas être un problème dans le premier exemple ci-dessus); ou dans Linux/Bash, vous ne pouvez pas à la fois en lecture et en écriture à un port série dans le même temps, et donc "Invalid argument
" risquerait de se produire dans ces moments où la lecture et l'écriture semblent se produire en même temps.
Donc mes questions sont:
- Est-il un moyen de faire quelque chose comme ceci (
cat
un fichier à un port série configuré comme de bouclage; lire et de voir combien de temps il faut) que dans Bash, sans recourir à l'écriture d'une dédiée programme C? - Si j'ai besoin d'un dédié programme en C, toute source d'exemples sur le net je pourrais utiliser?
Merci beaucoup pour toutes les réponses,
Cheers!
EDIT: je suis conscient que le while
boucle écrit ci-dessus n'est pas la sortie; commande en ligne a des fins de tests préliminaires, et je vous interrompre à l'aide de Ctrl-C. ( j'ai pu, en principe, l'interrompre avec quelque chose comme timeout -9 0.1 bash -c 'while (true) do echo AA ; done'
, mais qui irait à l'encontre de l'objectif de time
, puis 🙂 )
La raison que while
est là, c'est que pour le moment, la lecture via cat
de l'appareil quitte immédiatement; à la fois, j' ont configurer l'appareil, de sorte que lorsque cat
est délivré, il en fait des blocs et attend l'arrivée de données; mais je ne peux pas encore comprendre ce qui se passe (et partiellement c'est pourquoi je suis à la recherche d'un moyen de test à partir de la ligne de commande).
Dans le cas où je n'ai pas utilisé le while
, j'imagine que pour l'heure, j'avais utiliser quelque chose comme:
time bash -c 'comm <(echo "1234567890" > /dev/ttyUSB0) <(cat -A /dev/ttyUSB0)'
... mais pour que cela fonctionne, en quelque sorte, suppose que cat -A /dev/ttyUSB0
commence la première et de blocs; puis le echo
écrit pour le port série (et sorties); et puis cat -A
sorties quelle que soit sa lecture à partir du port série - et puis quitte. (Et je ne suis pas vraiment sûr ni si un port série peut se comporter de cette façon, ni si cat
peut être fait pour bloquer et de sortie de manière arbitraire comme ça).
La méthode exacte n'a pas vraiment d'importance; si possible, j'aimerais éviter de coder mon propre programme en C pour faire ce genre de tests - qui est la raison de mon intérêt principal est de savoir si c'est possible en quelque sorte à exécuter un tel "full-duplex" essai d'utilisation de base Bash/Linux (c'est à dire coreutils
); (et si non, si il y a un code que je peux utiliser quelque chose comme ceci).
EDIT2: peut-être Aussi pertinentes:
- Si vous étiez à obtenir que cela fonctionne, le
while
boucle se termine jamais. Comment vous proposez-vous de le faire et où comptez-vous mettre latime
commande? Avez-vous considéré l'utilisation de votre première méthode avecpv
dans la lecture de la boucle? - Salut Denis, merci beaucoup pour votre réponse! J'ai édité le post ci-dessus, j'espère qu'elle clarifie les questions que vous avez soulevées! Btw, je n'ai jamais entendu parler de
pv
avant, je suppose que vous parlez de la pv(1): suivre les progrès de données par le biais de pipe - Linux page de manuel - je vais prendre un coup d'oeil à cette...
Vous devez vous connecter pour publier un commentaire.
Bien, j'ai réussi à mettre
writeread.c
dans une version filetée à l'aide depthread
(code est ci-dessous - je ne pense pas queserial.h
beaucoup changé; il n'est pas utilisé dans la version letée de toute façon). J'ai également réduit la vitesse de 115200, et maintenant, je peux confirmer ces mesures avec l'appareil, dans l'exemple de ligne de commande de session ci-dessous:Bien, les mesures maintenant un rapport jusqu'à 99% de la vitesse de transmission, alors je suppose que cela signifie que le profilage aspect de ce programme devrait fonctionner. Avis:
write
est exécuté en un seul morceau (que le PC doit être capable de gérer l'ordonnancement de paquets, si nécessaire),read
se passe dans de plus petits morceaux (probablement indiquant que le périphérique ne pas attendre pour l'ensemble du morceau arrivée, au lieu de cela, il commence à envoyer des arrière petits morceaux dès qu'il a reçu suffisamment de)Bien, je suppose que c'est ce dont j'avais besoin à l'origine; je pense que c'est probablement pas possible d'organiser
cat
etecho
via un processus de substitution à exécuter dans cette, nous allons l'appeler "filée", manière 🙂 (Maintenant, j'ai un problème avec le même à 2000000 bauds, mais qui indique un problème avec la programmation de l'appareil).Cheers!
writeread.c - version filetée