Bash: запись на устройство, затем чтение с него

Я разрабатываю очень маленькую программу с датчиком веса, подключенным к S0. Вот как я инициализирую последовательный порт:

stty -F /dev/ttyS0 9600 min 60 time 1 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke parenb -ixon

Я протестировал несколько способов записи на устройство, а затем чтения с него:

echo IDN? >> /dev/ttyS0
read -t1 output < /dev/ttyS0   # waits for ever here.

Я также пробовал:

echo IDN? >> /dev/ttyS0 && read -t1 output < /dev/ttyS0  # waits too

Но безуспешно. В одной строке это ничего не меняет.

until read -t1 < /dev/ttyS0; do
    echo IDN? > /dev/ttyS0
done
identity=$(echo $REPLY | tr -d $'\r')

Это работает, когда устройство подключено.


Для моих тестов я сделал это, и это сработало:

$ cat /dev/ttyS0 &
[1] 9188
$ echo IDN? >> /dev/ttyS0
HBM-xxxyyyzzz$

Три способа, которые я пробовал, не увенчались успехом. Может быть, потому что устройство отвечает быстрее, чем интерпретирует bash? Если это так, как я могу избежать этого, чтобы получить идеальный ответ от устройства по времени?

Что я на самом деле ищу, так это то, что если устройство не отвечает в течение 1 секунды, пропустите чтение, но если оно читает 200 мс, продолжайте, не дожидаясь последних 800 мс.


person Sw0ut    schedule 06.10.2015    source источник
comment
Но что должно произойти, если чтение происходит через 200 мс, но менее 1 секунды?   -  person Samuel    schedule 06.10.2015
comment
@Samuel Как только пройдет менее 1 секунды, чтение должно прекратиться и перейти к следующей строке.   -  person Sw0ut    schedule 06.10.2015


Ответы (1)


Открытие устройства в режиме чтения/записи должно работать.

exec 3<> /dev/ttyS0
echo "IDN?" >&3
read -t1 output <&3

Открытие файла с помощью exec означает, что файл остается открытым для нескольких команд, а не открывается и закрывается каждой командой.

person chepner    schedule 06.10.2015
comment
Большой. Большое спасибо :) - person Sw0ut; 06.10.2015
comment
Как потом закрыть устройство? - person Nowaker; 15.09.2020
comment
Если скрипт завершится, файл будет закрыт автоматически. Вы можете закрыть его явно (я думаю) с помощью exec 3<>-. - person chepner; 15.09.2020