How to send and receive data from serial port using command line?
In the past, I have used c++ and python to communicate with serial ports in a Linux and Windows environment. In Linux, I have also used programs like picocom, minicom, and cutecom for serial communication but now I want to read and write to the serial port using simple Linux commands which requires no installation of external programs. I would be using this method in raspberry pi to communicate with my Arduino board. In the below example I’m using stty for setting serial port options and I use echo and cat command to send and read data from the serial port but at the end, I’m not seeing any output, I have read other posts in this site related to this but nothing seems to work for me. I’m able to communicate with Arduino using cutecom but with below commands, I don’t see any response. Linux (Ubuntu):
$ stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb $ echo "1" > /dev/ttyUSB0 //send data $ cat /dev/ttyUSB0
#include void setup() < Serial.begin(115200); >void loop() < if(Serial.available() >0) < Serial.println("[123,55,7777]"); >>
Here i send 1 and i get the response from arduino: This should be pretty simple I send 1 or any character to Arduino and it should return [123,55,7777] in the command line. Any kind of help and guidance is appreciated. Below is the code that I have tried but doesn’t return any data.
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb #CONFIGURE SERIAL PORT exec 3 /dev/ttyUSB0 #SEND COMMAND HEX 0x01 TO SERIAL PORT sleep 0.2s #WAIT FOR RESPONSE kill $PID #KILL CAT PROCESS wait $PID 2>/dev/null #SUPRESS "Terminated" output exec 3
Заметки о Linux, электронике, радиолюбительстве
В предыдущем посте было показано как запустить UART на отладочной плате Launchpad для MSP430. Теперь рассмотрим как общаться с платой при помощи средств командной строки Linux. Используется плата с прошивкой из предыдущего поста. Для подробностей - см. под кат
Как известно, все устройства последовательных портов представлены файлами устройств в каталоге /dev.Через эти файлы и происходит общение ОС Linux с внешним устройством на последовательном порту. Чтобы передать что-то на внешнее устройство нужно записать данные в файл устройства, а чтобы считать информацию из устройства --- прочитать данные из файла устройства. Это можно делать при помощи команд cat и echo так же как для обычных файлов на диске. Или внутри программы на С при помощи вызовов ioctl(), read() и write() или библиотеки termios.
Физическим последовательным портам RS232, к которым подключались диалапные модемы на старых компьютерах, соответствуют файлы устройств /dev/ttyS*, начиная с /dev/ttyS0. Виртуальным последовательным портам, которые создаются различными конвертерами USBUART соответствуют файлы устройств /dev/ttyUSB* и /dev/ttyACM*. Ядро Linux автоматически разпознаёт подключенное устройство, загружает для него драйвер и создаёт файл устройства. Вручную устанавливать драйвер, как в ОС Windows не требуется. Например, если подключить к USB преобразователь USBUART FT232, то создаётся файл устройства /dev/ttyUSB0, с которым можно работать также как и с обычным последовательным портом. На плате Launcpad находится микросхема TUSB3410, которая тоже представляет собой конвертер USBUART. Если подключить её к USB, то создаётся файл устройства /dev/ttyACM0. Чтобы общаться с платой нужно что-либо писать/читать с этого файла.
Чтобы пользователь мог читать или писать в файл устройства последовательного порта, его нужно добавить в группу dialout. Иначе работать с последовательным портом сможет только администратор root.
Простейшим приложением с графическим интерфейсом, которое работает с последовательным портом, является CuteCOM. Он обычно уже есть в вашем дистрибутиве Linux. Его можно установить из репозиториев. При помощи CuteCOM мы работали с платой в предыдущем посте. Выглядит CuteCOM вот так:
Работать с ним крайне просто. Указываем нужное устройство, если его нет в списке, то его можно впечатать вручную. Затем указываем скорость и параметры и нажимаем OpenDevice. В окне видим данные, которые пришли от устройства. В поле ввода в нижней части можем печать строку символов, которые предаются на устройство. Чтобы передать данный нажимаем Enter и смотрим ответ устройства в окне.
Теперь рассмотрим как работать с COM-портом из командной строки. Для этого служат три команды: stty, cat и echo.
Команда stty устанавливает параметры и скорость COM-порта. Её формат:
stty -F
Чтобы установить параметры для платы Launchpad для соединения на скорости 9600 нужно выполнить:
$ stty 9600 -F /dev/ttyACM0 raw -echo
Параметр raw устанавливает, что данные в компьютер передаются байт за байтом так же как приходят в порт без преобразований. Аппаратное управление потоком отключено. Подробнее о том, что включает и выключает raw - см. man stty. Если не включить raw, то скорее всего ничего работать не будет.
Теперь в той же консоли нужно набрать
$ cat /dev/ttyACM0
И можно смотреть данные, которые приходят от платы. Выход - нажать Ctrl+C.
Теперь нажимаем на плате RESET и видим, что в консоди напечатался текст.
Чтобы передать в плату данные, в другой консоли нужно использовать команду echo и перенаправление вывода в файл устройства. Наберём в другой консоли:
$ echo "1">/dev/ttyACM0
Видим, что на плате загорелся красный светодиод и в первой консоли было выдано сообщение об этом. Чтобы убрать конец строки в передаваемых данных, то нужно использовать запуск echo -n, а чтобы интерпретировать 16-ричные коды -- нужно echo -e. Ключи можно комбинировать.
В итоге должно получиться так:
Чтобы увидеть 16-ричные коды данных, приходящих от устройства, нужно использовать команду hexdump:
$ cat /dev/ttyACM0|hexdump -C
Получится вот так:
Чтобы иметь вывод данных от устройство на экран и в текстовый файл нужно использовать tee:
$ cat /dev/ttyACM0|tee output.txt
Все эти команды можно встраивать в свои Bash-скрипты и работать с вашим устройством вообще без программирования со стороны компьютера.
BASH + COM port чтение в переменные, обработка
Бьюсь над проблемой. Концепция такова. Есть устройство на COM порте, по записи в него команды "g", посредством такой команды:
cat /dev/ttyUSB0 & echo "g" > /dev/ttyUSB0
dlex@workstation:/var/www/test/bash$ cat /dev/ttyUSB0 & echo "g" > /dev/ttyUSB0 [6] 18791 dlex@workstation:/var/www/test/bash$ 0.00 0.00 23.40 23.69
Всё бы хорошо, но это конечно только проверка адекватности вывода по запросу. Далее следует разобрать полученную строку на переменные, которые уйдут как значения в базу данных следующим образом:
#!/bin/sh while IFS=" " read LITRAGE FLOW T1 T2 ; do [ -z "LITRAGE" ] && continue mysql -u admin-um -pdrums um-jekeha
Здесь, до выполнения этого скрипта, я применил вывод cat в log файл, иначе ничего не выходило. Таким образом в базу он загоняет значения, с одним НО. В базу приходят 2 строки. в одной все значения 0, во второй актуальные значения, считанные ранее из устройства. Вопрос первый, как реализовать чтение устройства сразу в переменную/переменные, без файла? Вопрос второй, если я размещаю запрос "cat/echo" к устройству непосредственно в скрипте, ничего не происходит, как исправить? Хотелось бы исполнять это одним скриптом.
1 ответ 1
#!/bin/sh cat /dev/ttyUSB0 | awk '' | \ mysql -u admin-um -pdrums um-jekeha & echo "g" > /dev/ttyUSB0
Доработайте по необходимости. Основная идея: подаем весь вывод из COM порта на вход AWK, который по умолчанию разбивает строку по пробелам в переменные $1 $2 и т.п. В нем же проверяем if($1!='') что строка не пустая. И печатаем вашу строку insert into подставляя переменные. С экранированием кавычек я не разобрался и заменил их на \x27 - код одинарной кавычки. Все что напечатал AWK подаем на вход mysql. Все это запускаем в фоне & и после этого подаем вашу команду 'g' на устройство. Во время отладки можете убрать последний | и mysql он на консоль напечатает готовый к выполнению sql-запрос.
Но остается вопрос как завершить потом cat, когда все будет сделано, он скорее всего так и продолжит висеть и ожидать ввод. В принципе если вы будете после этого раз в минуту подавать команду 'g' и устройство будет выдавать свои данные - возможно это то что вам и надо. Но очень на долго без работы висеть cat и соответственно mysql оставлять нельзя, потому как mysql может по таймауту потерять коннект к базе.
Шпоры
Инсталляцию рассматриваем на: # uname -prs FreeBSD 7.2-RELEASE i386 Ищем нужный порт: # cd /usr/ports # make search name=awstats Port: awsta.
Что такое CUDA? Смотрите в википедии. Рассмотрим коротко простейшие примеры использования этой интересной технологии. Этот пост является кон.
Проведем краткий обзор установки проприетарного драйвера для видеокарты NVIDIA. Смотрим, какая видеокарта установлена в нашем компьютерне.
Если у нас есть программа, написанная с использованием gtk, то она может работать и на юникс-системах и на windows. Ее исходники не надо пер.
Хорошо, если у нас есть ноутбук с Debian wheezy. А что если у нас есть второй монитор и мы хотим его подсоединить к нашему ноутбуку? В моем.
Этот текст является конспектом глав "классы", "производные классы", "иерархии классов" книги Страуструпа &quo.
Весь интернет пестрит примерами использования OpenGL. Найти их не сложно. OpenGL сам по себе является кроссплатформенным. А поэтому, чтобы с.
Кваренион - это такая четырехкомпонентная сущность, с помощью которой можно задавать вращения в трехмерном пространстве. Их преимущество пер.
Если вам вдруг понадобилось вычислить дискретное преобразование Фурье, то для этой цели прекрасно подойдут два инструмента: http://www.fftw.
Вывод параметров порта в читаемом виде: #stty -a -F /dev/ttyUSB0 Переключение в raw режим: #stty -F /dev/ttyUSB0 raw -echo -echoe -echo.