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 la time commande? Avez-vous considéré l'utilisation de votre première méthode avec pv 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...
InformationsquelleAutor sdaau | 2010-09-13