Монитор ком порта linux

Обновлено: 07.07.2024

Урок посвящен интерфейсу RS-232, который в простонародье называют COM-порт. Мы разберемся как он представлен в Linux, какой у него интерфейс, научимся его конфигурировать, а также узнаем, что написание программы для коммуникации через COM-порт в Linux не представляет сложности.

$dmeg | grep «ttyS»

то мы увидим, что, в действительности , у меня только один файл ttyS4 связанный с конкретным COM-портом, у которого есть некоторый диапазон ввода/вывода, номер прерывания, и который сейчас настроен на скорость обмена 150200 бит в секунду (или бод).

Для того, чтобы сконфигурировать мой COM-порт по умолчанию в Linux можно воспользоваться программой mincom, запускать её нужно от суперпользователя, либо добавить текущего пользователя в группу dialout. Запустим

$sudo minicom -s

Ключ -s – обозначает конфигурацию (setup),

Здесь мы видим следующее [2:24]. Есть параметры последовательного порта, важно прописать правильно файл, то есть указать тот файл, который у вас в системе связан с физическим COM-портом, Второй важный момент – это настройка параметров обмена (ключ Е). Дело в том, что корректный обмен данными по последовательному соединению возможен только тогда, когда обе стороны имеют один и тот же набор параметров. В этом окне можно набор этих параметров менять [3:08]. Мы видим, что у нас задана скорость 8 бит, нет контроля четности, и один стоповый бит. Именно здесь можно это все увидеть и настроить так, как требуется или, как требует ваше устройство.

Сохраняем конфигурацию по умолчанию. Дальше будем взаимодействовать - сначала с помощью команды терминала, чтобы проверить, как вручную это работает; а потом напишем небольшую программу, которая будет слать данные в COM-порт. Выйти из Mincom можно набрав ctrl-A-X.

Для того чтобы проверить, как работает COM-порт можно воспользоваться программой miniterm [4:03]. Я создал виртуальную машину с обычным linux, у неё указал, что в наличии имеется один COM-порт (это COM1), по умолчанию назначились линии обработки запросов прерывания. Я ассоциировал этот COM-порт с файлом на моей host-машине. С этого файла мы будем читать данные записанные в порт.

Итак, мы видим, что в левой части экрана у нас есть логин на виртуальную машину [4:46]. Давайте проверим с помощью minicom -s, как настроены коммуникации. Проверим, что /dev/ttyS0 – это действительно правильный физический порт – да, это именно так. Теперь мы можем вызвать команду

$sudo miniterm

она говорит, что есть следующие доступные порты, и просит ввести, через какой порт работать. Далее я попадаю терминал, связанный с COM-портом, где могу набирать текст. Набирая команды, я вижу «эхо» в моем файле справа. Обратите внимание, что я пишу в левом окне, а на экране надпись мы видим в правом. В левом окошке – виртуальная машина, на которой настроен порт. В правом – тот лог, который мы видим в файле ассоциированном с этим COM-портом на host-машине.

Создадим какой-нибудь каталог, в котором будем разрабатывать приложение. Как это ни странно, приложение будет выглядеть очень просто, потому что все действия, которые мы делаем с COM-портом в linux, это действия с файлами с использованием тех же самых файловых операций. Нам потребуется stdio.h, unistd.h, чтобы получить доступ – функциям open/read/write, fcntl.h, чтобы иметь возможность использовать файловые флажки. Открываем файловый дескриптор, COM-порт, имя, и флаги из COM-порта. Проверим, что файловый дескриптор у нас открылся, то есть если порт меньше или равен 0, то есть какая-то ошибка, оповестим об этом пользователя и вернем управление. В противном случае, можно писать в этот файловый дескриптор. write принимает файловый дескриптор, указатель на буфер, размер. Дальше мы закрываем файловый дескриптор и возвращаем управление. Приложение готово.

Теперь давайте попробуем запустить то, что у нас вышло, вернее, скомпилировать и запустить [10:40]. При запуске приложения произошла ошибка, но она вызвана понятными причинами, потому что пользователь должен был быть включен группу dialout [11:03], или нам надо запускать приложение от суперпользователя. Сделаем это. И сразу видим, что в нашем окошке появилась запись «hello world». Можно повторить и увидеть, что все работает корректно.

Точно таким же образом можно осуществлять чтение из COM-порта, то есть использовать не функцию write, а функцию read.

В предыдущем посте было показано как запустить 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 и перенаправление вывода в файл устройства. Наберём в другой консоли:

В итоге должно получиться так:


Чтобы увидеть 16-ричные коды данных, приходящих от устройства, нужно использовать команду hexdump:

$ cat /dev/ttyACM0|hexdump -C

Получится вот так:


Чтобы иметь вывод данных от устройство на экран и в текстовый файл нужно использовать tee:


В этой заметке я расскажу про то, как можно проверить COM порт в Linux.

Для этого нам понадобятся:

  • права на чтение и запись в COM порт
  • программа minicom
  • кусок толстого многожильного кабеля
Права доступа

проверяем какие у нас в системе есть COM порты, а также наши права на них:

/dev/ttyS0 это первый COM порт
/dev/ttyS1 соответственно второй COM порт
/dev/ttyUSB0 специальный кабель-переходник из USB в COM (Gembird UAS111)

Как мы видим для работы с COM портом необходимы права root либо пользователь должен входить в группу dialout

Провод для связи


Берём многожильный кабель в оплётке длиной 4-6 см, и соединяем 2 и 3 выводы COM порта перемычкой из этого кусочка провода. Оплётка будет удерживать провод на контактах, а металлические жилы внутри будут проводниками.
Для любителей паять можно предложить спаять полный loop-back тестер. В нём соединить не только контакты приёма передачи, но и аппаратный контроль потока и готовность терминала.

Работа с программой minicom

Для начала необходимо настроить программу minicom

+-----------[конфигурация]-----------+
| Каталоги и файлы
| Протоколы
| Настройка последовательного порта
| Модем и дозвон
| Экран и клавиатура
| Сохранить настройки как dfl
| Сохранить настройки как.
| Выход
| Выход из Minicom
+------------------------------------+

Выбираем «Настройка последовательного порта»

+-----------------------------------------------------------------------+
| A - Последовательный порт : /dev/ttyS0
| B - Размещение lock-файла : /var/lock
| C - Программа при выходе :
| D - Программа при запуске :
| E - Скорость/Чётность/Биты : 115200 8N1
| F - Аппаратное управление потоком : Да
| G - Программное управление потоком : Нет
|
| Какую настройку изменить?
+-----------------------------------------------------------------------+

Если нужно, меняем СОМ порт, нажимая «A»
Отключаем аппаратное управление потоком, нажимая «F»
Выходим из настроек «Enter»
Сохраняем настройки по умолчанию «Сохранить настройки как dfl»
Выходим из minicom

Собственно проверка СОМ порта

Запускаем minicom без параметров.

Пробуем нажимать на клавиши. В ответ на экране должны появляться символы.
Проверка COM порта под linux завершена.

Эта запись была сделана 21.12.2010, 13:50 под рубрикой Разное. Вы можете подписаться на эту запись с помощью RSS 2.0. Both comments and pings are currently closed.

Репутация: нет
Всего: 3

Доброго времени суток.

Divide Et Impera

Репутация: 1
Всего: 8

echo позволяет работать с портом, но увы настроек сокрости и тп вы не найдете.

Если все-же решитесь доустановить рекомендую minicom

Репутация: нет
Всего: 3

jhonyxakep, спасибо!

1. Можно подробнее о работе с COM-портом посредством echo? Можно ли комбинированно работать с echo, stty и setserial?

2. Minicom - в стандартном репозитории имеется, попробую воспользоваться.

Репутация: нет
Всего: 3

Значительно удовлетворила графическая утилита cutecom.

По echo вопрос остается открытым.

Репутация: 2
Всего: 14

Репутация: нет
Всего: 3

Репутация: 2
Всего: 14

Репутация: 22
Всего: 317

можно "по-умному": написать драйвер, который будет это устройство ловить, и писать "туляля", время от времени делать диагностику, проверять статус, и т.д. и т.п. вопрос нужды и свободного времени.
в принципе, посл. порт - устройство "последовательное", т.е. символьное.
работа - посылаешь команды (символы), получаешь результат.
для настройки таймингов и т.д. пишут драйвер.
после узнавание подсистемой USB он настроит тебе устойство оптимально по спекам, и т.д.
желательно реализовывать все по принципу read/write/ioctl

Репутация: 2
Всего: 14

для настройки есть setserial

Репутация: нет
Всего: 3

jhonyxakep, спасибо за подкинутый minicom
500mhz, спасибо за примерчик с echo
bilbobagginz, спасибо за проявленное внимание к вопросу.
Как раз именно драйвер устройства я писать и планирую. Но, чуток попозже. Нужно освоиться с COM портом вообще, так как отродясь с железками не работал.
Это будет отдельная тема.
Вопрос.
Чем отличается драйвер устройства от библиотеки, предназначенной для работы с этим устройством? Планирую написание программы, для опроса определенных параметров с устройства, реализовывать собираюсь в виде библиотеки. Спрашиваю, потому-что делаю это впервые.

Репутация: 2
Всего: 14

Вопрос, а нужен ли именно драйвер?
Вообще библиотека это загружаемый модуль в адресное пространство процесса и соответственно имеет те же самые привилегии что и процесс.
А драйвер (в линюксе называется LKM - loadable kernel module) работает в пространстве кернела и соответственно имеет наивысшие привилегии, так что получить кернел паник при ошибке - запросто.
В вашем случае думаю достаточно просто библиотеки так как драйвера СОМ портов уже присутствуют в системе.

Репутация: нет
Всего: 3

500mhz, вы правы, буду реализовывать в виде библиотеки - в драйвере никакой острой необходимости нет.
Сейчас балуюсь с com-портом. Тестирую соединением напрямую 2-го и 3-го контакта порта.
Кстати, узнал, что для работы нужно было добавить пользователя в группу dialout.
Программка CuteCom - всё делает правильно: всё, что отправляю на input - возвращает в output.
Как аналогичные действия произвести с помощью echo/cat?
Сейчас действия такие:
0. Закорачиваю pin 2 и pin 3 на COM порте.
1. Открываю параллельно 2 консоли.
2. В первой пишу cat /dev/ttyUSB0
3. Во второй консоли пишу: echo "h" > /dev/ttyUSB0
4. Проверяю первую консоль - ничего не происходит, ничего не ловится. А хотелось бы, что бы поймалось.

Репутация: 2
Всего: 14

Репутация: нет
Всего: 3

Да. Медной склепочкой два контакта соединил.

Репутация: 2
Всего: 14

Ну так а зачем вам echo / cat ? Если CuteCom работает.

Репутация: нет
Всего: 3

Причины 3:
1. Самообразование (прим: читать - шило в заднице)
2. На случай войны (если вдруг иксы не подымутся и пользоваться только базовой системой придется, без minicom и cutecom)
3. Через echo/cat вроде бы общеизвестный и очевидный способ. Хочется его все таки проверить самостоятельно.

Репутация: 2
Всего: 14

Репутация: 1
Всего: 62


В этом случае проблема обычно в том, что для приёма/передачи данных требуется программное либо аппаратное управление потоком. В последнем случае используются сигналы CTS/RTS, установку/снятие которых нужно обеспечить аппаратно. Вообще, есть великий мануал по RS-232: The Serial Programming Guide for POSIX Operating Systems (русский перевод). Он покрывает почти 100% всех возникающих вопросов. И не стоит обращать внимание, что мануалу уже 13 лет - API работы с RS-232 нисколько не изменился

Репутация: 2
Всего: 14

я так думаю что просто при echo /cat у нас 2 процесса и они между собой не синхронизируют посылку и прием вот и все

Репутация: нет
Всего: 3

В общем, вопрос можно закрывать.
Итог обсуждения:
в Debian для удобной и простой работы с Com-портом штатными средствами хорошо подходит - cutecom.

Всем еще раз спасибо.
Вдохновлен.

Divide Et Impera

Репутация: 1
Всего: 8

Кстати насчет драйвера и модуля.

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

  • Поиск и установка драйверов для *n?x-систем.
  • Настройка различных устройств (например звука или аппаратного ускорения видео).
  • Выбор *n?x совместимого железа, обмен опытом и.т.д.

Вопросы мобильной разработки тут

Вопросы о настройке системы (например разбивка и форматирование диска, настройка сети) сюда не относятся.

Чтобы получить наибольшую пользу от данного раздела, убедитесь, что вы четко сформулировали свой вопрос и привели точные данные о конфигурации компьютера, а так же указали версию драйвера, версию ОС и версию ядра.
При проблемах с железом желательно указывать вывод комманд lspci, lsusb и dmesg (запускать под root-ом), содержимое соответствующих логов (лежат в /var/log) и конфигурационных файлов (лежат в /etc). Чем больше информации мы получим, тем быстрее сможем помочь Вам.

  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).

В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.

[ Время генерации скрипта: 0.1681 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Для правильного подключения оборудования, необходимо определить номер COM порта.

Проверка проводится при условии, что сервер полностью развернут, и работает заведомо правильно.

Windows

Для определения номера COM порта на ОС Windows необходимо:

  1. Убедиться в том, что многожильный кабель подключен к COM-порту
  2. Перейти в "Диспетчер устройств", расположенный в: Панель управления\Оборудование и звук\Диспетчер устройств (необходимы права администратора)
  3. Раскрыть дерево "Порты (COM и LPT)"
  4. Отсоединить многожильный кабель
  5. Запомнить изменения в дереве устройств "Порты (COM и LPT)"
  6. Присоединить многожильный кабель обратно к COM-порту
  7. Найти новый порт в дереве устройств "Порты (COM и LPT)"

ComP 1.jpg

8. После того, как номер COM-порта определен его необходимо указать в схеме SCADA, для устройства, подключенного многожильным кабелем.

ComP 2.jpg

Linux

Для определения номера COM порта на ОС Linux необходимо:

  1. Обладать правами Root либо пользователь должен входить в группу dialout
  2. Убедиться в том, что многожильный кабель подключен к COM-порту
  3. Проверить наличие COM портов в системе, введя в командную строку следующую команду:

4. После выполнения команды отобразится список всех доступных COM-портов

ComP 3.jpg

dev/ttyS0 - первый COM порт

/dev/ttyS1 - второй COM порт

/dev/ttyUSB0 - специальный кабель-переходник из USB в COM (Gembird UAS111)

5. Установить программу minicom. Для этого вводим следующую команду:

6. Найти многожильный кабель в оплётке длиной 4-6 см.

7. Соединить 2 и 3 выводы COM порта перемычкой из кусочка многожильного провода. Оплётка будет удерживать провод на контактах, а металлические жилы внутри будут проводниками.

8. Настроить программу minicom. Для этого вводим следующую команду:

ComP 5.jpg

9. Выбрать "Настройка последовательного порта"

ComP 6.jpg

10. Нажимая А поочередно выбираем порты (если используется кабель-переходник из USB в COM то выбрать /dev/ttyUSB0)

11. Отключить аппаратное управление потоком, нажав «F»

12. Выйти из настроек нажав «Enter»

13. Сохранить настройки по умолчанию «Сохранить настройки как dfl»

14. Выйти из minicom

15. Запустить minicom выполнив команду:

16. Нажать на любую клавишу на клавиатуре

ComP 7.jpg

В случае, если символы не вводятся с клавиатуры, необходимо вернуться к пункту 10, и выбрать другой COM-порт

Если вводимые символы отображаются - значит COM-порт определен верно

17. После того, как номер COM-порта определен его необходимо указать в схеме SCADA, для устройства, подключенного многожильным кабелем.

Читайте также: