Отправка последовательных данных на USB-порт из терминала?

Вопрос или проблема

У меня есть Arduino, подключенный к USB-порту (на моей ОС на базе Linux) по адресу /dev/ttyACM0, который ждет последовательные данные для чтения и обрабатывает их по мере поступления. Все, что мне нужно сделать, это отправить данные на этот порт. Я использовал программу minicom с помощью следующей команды:

minicom --device=/dev/ttyACM0 --baudrate=9600

и это работает прекрасно. Проблема в том, что minicom работает в интерактивной среде, и я хотел бы написать оболочку скрипт, который отправляет информацию не интерактивно, что-то вроде

minicom --device=/dev/ttyACM0 --baudrate=9600 "сообщение"

Насколько я понимаю, в Unix все является файлом – даже USB-порты – поэтому я задумался, возможно ли просто echo байты непосредственно в файл устройства:

echo "сообщение" >/dev/ttyACM0

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

$ stty -F /dev/ttyACM0
speed 9600 baud; line = 0;
min = 0; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

Но скорость передачи составляет 9600. Есть ли способ заставить это работать с вышеуказанной командой?

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

Но, я думаю, вы могли бы обойтись своим скриптом, используя EXCEPT, который является языком сценариев, который имеет свою оболочку и может автоматизировать взаимодействие между tty и пользователем.

    #!/usr/bin/expect -f
    set timeout -1
    spawn ./que.sh
    expect "Введите ваше имя\r"
    send -- "Я Нихил\r"
    expect "Введите ваш возраст\r"
    send -- "24\r"
    expect "Введите вашу зарплату\r"
    send -- "100к\r"
    expect eof

Первая строка определяет путь к команде expect, который равен #!/usr/bin/expect. На второй строке кода мы отключаем таймаут.

Затем мы запускаем наш скрипт, используя команду spawn. Мы можем использовать spawn для запуска любой программы или любого другого интерактивного скрипта.

Команда spawn используется для запуска скрипта или программы, такой как оболочка, FTP, Telnet, SSH, SCP и т.д.

Оставшиеся строки являются скриптом Expect, который взаимодействует с нашим оболочным скриптом.

Последняя строка – это конец файла, что означает конец взаимодействия.

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

Использование описано вводом man expect из оболочки; кроме того, следующая страница объясняет это подробно:

https://www.geeksforgeeks.org/expect-command-in-linux-with-examples/

Надеюсь, я смог помочь.

Если вы все еще не похоронили топор войны… может быть, runscript – это то, что вам нужно?

Ответ или решение

Для отправки последовательных данных на USB-порт из терминала в системе Linux, есть ряд подходов, включая использование команды echo, а также более сложных инструментов, таких как Expect. Давайте подробно рассмотрим все шаги для достижения этой цели.

1. Подготовка порта

Прежде всего, необходимо убедиться, что ваш USB-порт, к которому подключен Arduino (например, /dev/ttyACM0), правильно настроен для взаимодействия. Проверить текущие настройки порта можно с помощью команды:

stty -F /dev/ttyACM0

Вывод этой команды должен подтвердить, что скорость передачи (baud rate) установлена на 9600:

speed 9600 baud; ...

Если настройки верные, можно переходить к отправке данных.

2. Отправка данных с помощью echo

В Unix все является файлом, включая последовательные порты. По умолчанию echo может использоваться для отправки данных на порт. Однако для этого следует учитывать, что некоторые параметры могут влиять на отправку. Стандартная команда для отправки сообщения может выглядеть следующим образом:

echo "ваше сообщение" > /dev/ttyACM0

Если после этого данные не приходят, возможно, следует использовать echo с добавлением перенаправления и проверки на stderr. Например:

echo "ваше сообщение" > /dev/ttyACM0 2>/dev/null

3. Использование программы minicom в неинтерактивном режиме

К сожалению, minicom предназначен для интерактивного использования и не поддерживает отправку сообщений непосредственно через командную строку. Однако вы можете использовать screen или cat для этой цели. Пример с использованием cat:

cat /dev/ttyACM0

Этот метод сразу выводит все, что поступает на порт в терминал.

4. Применение Expect для автоматизации

Если у вас есть необходимость в автоматизации процесса взаимодействия с интерактивными программами, вы можете использовать скрипт Expect. Вот пример:

#!/usr/bin/expect -f
set timeout -1
spawn minicom --device=/dev/ttyACM0 --baudrate=9600
expect "Press ENTER to continue"
send "ваше сообщение\r"
expect eof

Скрипт запускает minicom, ждет приглашения и отправляет сообщение.

5. Заключение

Вы можете использовать простые команды Bash для передачи данных на USB-порт или перейти на более сложные сценарии с использованием Expect, если ваша задача требует автоматизации. Также можно использовать другие инструменты, такие как screen, picocom, или даже разработать собственные приложения на Python с применением библиотеки pySerial для более гибкой работы с последовательными портами.

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

Оцените материал
Добавить комментарий

Капча загружается...