Я разрабатываю очень маленькую программу с датчиком веса, подключенным к 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 мс.