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

У меня есть устройство, подключенное к последовательному порту. Фактически, это температурный датчик на основе 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 после каждого ответа или что-то еще?

  • Как получить файл на хост, когда все, что у вас есть, это последовательная консоль?
  • Как получить сообщения ядра на последовательной консоли в системе systemd?
  • Как настроить последовательное соединение через USB с помощью g_serial
  • Как проверить, что два подключенных последовательных порта действительно передают данные?
  • Доступ к корневой файловой системе и подкаталогам из U-boot?
  • Возможно ли иметь два отдельных односторонних (симплексных) последовательных порта для создания одного устройства tty?
  • Настройка Getty для аппаратного терминала
  • Как изменить ширину удаленной последовательной консоли?
  • 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, чтобы остановить любую специальную обработку ввода.

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