воскресенье, 27 июля 2014 г.

Работа с последовательным портом из консоли Linux

В предыдущем посте было показано как запустить UART на отладочной плате Launchpad для MSP430. Теперь рассмотрим как общаться с платой при помощи средств командной строки Linux. Используется плата с прошивкой из предыдущего поста. Для подробностей - см. под кат


Как известно, все устройства последовательных портов представлены файлами устройств в каталоге /dev.Через эти файлы и происходит общение ОС Linux  с внешним устройством на последовательном порту. Чтобы передать что-то на внешнее устройство нужно записать данные в файл устройства, а чтобы считать информацию из устройства --- прочитать данные из файла устройства. Это можно делать при помощи команд cat и echo так же как для обычных файлов на диске. Или внутри программы на С при помощи вызовов ioctl(), read() и write() или библиотеки termios.

Физическим последовательным портам RS232, к которым подключались диалапные модемы на старых компьютерах, соответствуют файлы устройств /dev/ttyS*, начиная с /dev/ttyS0. Виртуальным последовательным портам, которые создаются различными конвертерами USB<->UART соответствуют файлы устройств /dev/ttyUSB* и /dev/ttyACM*. Ядро Linux автоматически разпознаёт подключенное устройство, загружает для него драйвер и создаёт файл устройства. Вручную устанавливать драйвер, как в ОС Windows не требуется. Например, если подключить к USB преобразователь USB<->UART FT232, то создаётся файл устройства /dev/ttyUSB0, с которым можно работать также как и с обычным последовательным портом. На плате Launcpad находится микросхема TUSB3410, которая тоже представляет собой конвертер USB<->UART. Если подключить её к 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-скрипты и работать с вашим устройством вообще без программирования со стороны компьютера.

Про работу с последовательным портом на Python можно прочитать здесь:
Если нужно написать своё приложение на Qt, котрое работает с устройством на COM-порту, то смотрите здесь http://diymicro.ru/pic-mk-eksperiment-n … yu-qt.html про расширение для Qt qserialport.

На этом всё.

3 комментария:

  1. Здравствуйте. А можно к вам обратиться с вопросом? Нужна помощь. Я очень полюбил linux и сейчас изучаю его. Но знаний не хватает. Вот сейчас нужно сделать так. У меня armbian, который использует systemd. У меня устройство имеет аналоговый вывод TV, но у меня нет телевизора. Зато есть маленький дисплей принимающий и отображающий информацию по uart. И вот диллема. Я смог подключиться к этому компьютеру по ssh. Но хочу использовать с тем uart дисплеем. Сейчас есть два tty. Это tty1 - TV и ttyS0 - uart. По умолчанию первым является tty1. Как мне настроить компьютер, чтобы всё, что выводится на tty1, просто на 100% дублировалось полностью на ttyS0?

    ОтветитьУдалить
  2. Чтобы дублировать системную консоль в терминальный порт, нужно использовать демон getty. Как он настраивается, можно посмотреть в Raspbian https://www.raspberrypi.org/forums/viewtopic.php?t=48683 . Тогда можно будет логиниться и выполнять команды с терминала. SSH это не tty1. В простейшем случае вывод команды можно дублировать на дисплей при помощи tee или перенаправления вывода.

    ОтветитьУдалить
  3. Please update old link. This is ok link:
    http://diymicro.ru/pic-mk-eksperiment-n19-pishem-prilozhenie-dlya-com-porta-s-pomoshhyu-qt/

    ОтветитьУдалить