Тест обратной связи / дуплекса последовательного порта в Bash или C? (подстановка процесса)

У меня есть последовательное устройство, настроенное как 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?
  • Если мне нужна специальная программа на языке 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: Также, возможно, актуально:

8
задан dsolimano 28 February 2013 в 15:30
поделиться