У меня есть последовательное устройство, настроенное как loopback (это означает, что оно просто будет отражать любой полученный символ), и я хотел бы измерить эффективную пропускную способность. Для этого я надеялся, что смогу использовать время
, как в
time bash -c '...'
, где ' ...
' будет некоторой командой, которую я могу запустить.
Итак, первая проблема заключается в том, что я хочу использовать устройство на скорости 2000000 бит / с, поэтому я не могу использовать ttylog или экран (они оба, похоже, увеличиваются только до 115200 бит / с ). Однако работа с / dev / ttyUSB0
как с файлом (с использованием перенаправления файлов и cat
), похоже, работает нормально:
# initialize serial port
stty 2000000 -ixon icanon /dev/ttyUSB0
# back to first terminal, I now have:
# $ while (true) do cat -A /dev/ttyUSB0 ; done
# 1234567890$
# ...
Теперь я хотел бы сделать что-то подобное - я хотел бы cat
файл для последовательного порта, и считывать последовательный порт - но с помощью одной команды терминала (чтобы я мог использовать его в качестве аргумента для времени
).
Я подумал, что могу использовать подстановку процесса Bash, чтобы части «записи» и «чтения» работали, как бы, «параллельно» - если я попробую это с именованными каналами, это сработает:
# 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
Вверх там я не использую comm
для каких-либо других целей, кроме (как бы) слияния двух процессов в одну команду (думаю, я мог бы с таким же успехом использовать echo
] вместо этого).
К сожалению, этот трюк, похоже, не работает с последовательным портом, потому что, когда я пробую его, я иногда получаю:
$ comm <(echo "1234567890" > /dev/ttyUSB0) <(while (true) do cat -A /dev/ttyUSB0 ; done)
cat: /dev/ttyUSB0: Invalid argument
... однако обычно я вообще ничего не получаю. Это говорит мне, что: либо нет контроля над тем, какой процесс запускается первым, и поэтому cat
может начать чтение до того, как порт будет готов (однако, это не похоже на проблему в первом примере выше); или в Linux / Bash вы не можете одновременно читать и писать в последовательный порт, и поэтому " Invalid argument
" будет появляться в те моменты, когда кажется, что и чтение, и запись происходят одновременно. время.
Итак, мои вопросы:
cat
файл для последовательного порта, сконфигурированного как loopback; прочтите его и посмотрите, сколько времени это займет) только в Bash, не прибегая к написанию специальной программы на C? Большое спасибо за ответы,
Ура!
РЕДАКТИРОВАТЬ: Мне известно, что описанный выше цикл while
не завершается; эта командная строка предназначалась для предварительного тестирования, и я прерываю ее, используя Ctrl-C. ( В принципе, я мог бы прервать его с помощью чего-то вроде timeout -9 0.1 bash -c 'while (true) do echo AA; done'
, но это нарушит цель time
, затем:) )
Причина, по которой пока
присутствует, заключается в том, что в настоящее время чтение через cat
с устройства немедленно завершается; время от времени я настраивал устройство , так что когда выдается cat
, оно фактически блокируется и ожидает входящих данных; но я пока не могу понять, что происходит (отчасти поэтому я ищу способ тестирования из командной строки).
В случае, если я не использовал while
, как я полагаю для определения времени, я бы использовал что-то вроде:
time bash -c 'comm / dev / ttyUSB0)
... однако для того, чтобы это работало, вроде бы предполагается, что сначала запускается cat -A / dev / ttyUSB0
и блокируется; затем эхо
записывает в последовательный порт (и выходит); а затем cat -A
выводит все, что было прочитано из последовательного порта, и затем завершается. ( И я не совсем уверен ни в том, может ли последовательный порт вообще вести себя подобным образом, ни в том, что cat
можно заставить заблокировать и выйти произвольно таким образом ).
Точный метод действительно не имеет значения; если это вообще возможно, я Я просто хотел бы избежать написания моей собственной программы C для проведения такого рода тестирования - вот почему меня прежде всего интересует, возможно ли каким-то образом запустить такой «полнодуплексный тест» с использованием базового Bash / Linux (например, coreutils
); ( а если нет, то если есть готовый код, могу использовать для чего-то вроде этого ).
EDIT2: Также, возможно, актуально: