Подключитесь к серийному, выпустите команду, прочитайте результат, запишите его и выйдите

У меня есть устройство, подключенное к последовательному порту. Фактически, это температурный датчик на основе Arduino .

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

Каков правильный способ сделать это?

Обычно при доступе к локальной программе нормально перенаправить вывод. Например, я читаю температуру CPU .

 datetime=$(date +%Y%m%d%H%M%S) cputemp=$(sensors atk0110-acpi-0 | sed "s/CPU Temperature:[^0-9]*\([0-9\.]\+\).*/\1/;tx;d;:x") echo "$datetime\t$cputemp" 

К сожалению, $() полагается на явный конец программы, что не относится к последовательной связи. Серийный сервер всегда в сети и не имеет явных «сеансов».

Конечно, я могу проверить линейные каналы. Но разве это правильное действие? Может быть, я должен написать свою программу Arduino чтобы отправить Ctrl-Z после каждого ответа или что-то еще?

One Solution collect form web for “Подключитесь к серийному, выпустите команду, прочитайте результат, запишите его и выйдите”

Как вы говорите, вы не можете прочитать конец файла из последовательного порта. (Ctrl-Z – вещь для Microsoft). Обычно вы читаете до тех пор, пока не получите требуемое количество символов, или пока не найдете разделитель, такой как символ новой строки, который сигнализирует о завершении данных.

Например, у меня есть последовательный порт USB с выходом, подключенным к входу, поэтому любые записи на устройство просто возвращаются обратно. Следующий скрипт может получить то, что отправляет устройство:

 #!/bin/bash tty=/dev/ttyUSB0 exec 4<$tty 5>$tty stty -F $tty 9600 -echo echo abcdef >&5 read reply <&4 echo "reply is $reply" 

Скрипт подключает последовательное устройство к файловому дескриптору 4 для ввода, 5 для вывода, устанавливает скорость и останавливает эхо, которое вы получаете для tty, а затем записывает «abcdef» и новую строку на устройство. Каждый символ будет немедленно отправлен, но драйвер ядра будет буферизовать некоторый ввод, поэтому мне не нужно начинать читать с устройства, прежде чем писать. Чтение завершается по умолчанию, когда видит новую строку, и сохраняет его в reply переменной, который затем повторяется в stdout. Вы можете поместить этот скрипт в использование типа v=$() .

Если данные вашего последовательного устройства не заканчиваются новой строкой, вы можете указать другой разделитель для чтения bash с помощью -d . Или, если ответ имеет постоянную длину, вы можете указать длину с -n . Если у вас есть двоичные данные, вы, вероятно, должны добавить raw в команду stty, чтобы остановить любую специальную обработку ввода.

Interesting Posts
Linux и Unix - лучшая ОС в мире.