Проверка COM порта под linux « Федоренко на связи
В этой заметке я расскажу про то, как можно проверить COM порт в Linux.
Для этого нам понадобятся:
- права на чтение и запись в COM порт
- программа minicom
- кусок толстого многожильного кабеля
Права доступа
проверяем какие у нас в системе есть COM порты, а также наши права на них:
# ls -l /dev/ttyS* /dev/ttyUSB*
crw-rw—- 1 root dialout 4, 64 Дек 21 11:46 /dev/ttyS0
crw-rw—- 1 root dialout 4, 65 Дек 8 15:43 /dev/ttyS1
crw-rw—- 1 root dialout 4, 66 Дек 8 15:43 /dev/ttyS2
crw-rw—- 1 root dialout 4, 67 Дек 8 15:43 /dev/ttyS3
crw-rw—- 1 root dialout 188, 0 Дек 21 07:27 /dev/ttyUSB0
/dev/ttyS0 это первый COM порт
/dev/ttyS1 соответственно второй COM порт
/dev/ttyUSB0 специальный кабель-переходник из USB в COM (Gembird UAS111)
Как мы видим для работы с COM портом необходимы права root либо пользователь должен входить в группу dialout
Провод для связи
Берём многожильный кабель в оплётке длиной 4-6 см, и соединяем 2 и 3 выводы COM порта перемычкой из этого кусочка провода.
Оплётка будет удерживать провод на контактах, а металлические жилы внутри будут проводниками.
Для любителей паять можно предложить спаять полный loop-back тестер. В нём соединить не только контакты приёма передачи, но и аппаратный контроль потока и готовность терминала.
Работа с программой minicom
Для начала необходимо настроить программу minicom
# minicom -s
+————[конфигурация]————+
| Каталоги и файлы
| Протоколы
| Настройка последовательного порта
| Модем и дозвон
| Экран и клавиатура
| Сохранить настройки как dfl
| Сохранить настройки как…
| Выход
| Выход из Minicom
+————————————+
Выбираем «Настройка последовательного порта»
+————————————————————————+
| A — Последовательный порт : /dev/ttyS0
| B — Размещение lock-файла : /var/lock
| C — Программа при выходе :
| D — Программа при запуске :
| E — Скорость/Чётность/Биты : 115200 8N1
| F — Аппаратное управление потоком : Да
| G — Программное управление потоком : Нет
|
| Какую настройку изменить?
+————————————————————————+
Если нужно, меняем СОМ порт, нажимая «A»
Отключаем аппаратное управление потоком, нажимая «F»
Выходим из настроек «Enter»
Сохраняем настройки по умолчанию «Сохранить настройки как dfl»
Выходим из minicom
Собственно проверка СОМ порта
Запускаем minicom без параметров.
# minicom
Пробуем нажимать на клавиши. В ответ на экране должны появляться символы.
Проверка COM порта под linux завершена.
Эта запись была сделана 21.12.2010, 13:50 под рубрикой Разное. Вы можете подписаться на эту запись с помощью RSS 2.0. Both comments and pings are currently closed.
Программирование COM-порта (RS-232) в Linux
Урок посвящен интерфейсу RS-232, который в простонародье называют COM-порт. Мы разберемся как он представлен в Linux, какой у него интерфейс, научимся его конфигурировать, а также узнаем, что написание программы для коммуникации через COM-порт в Linux не представляет сложности.
Разговор o коммуникации через COM-порт в Linux следует начать с того, что заметить, что каждому COM-порту в операционной системе соответствует файл устройства телетайп или tty. Он находится в каталоге dev и имеет имя /dev/ttyS и номер. Если посмотреть на мой каталог, то мы увидим следующее, что у меня таких файлов очень много [0:55].
Но по факту, в моем компьютере есть один физический COM-порт. Давайте попробуем его найти. Сделать это можно с помощью команды dmesg, которая выводит сообщения с момента инициализации системы. Если набрать
$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.
устройств — Как узнать, какой последовательный порт используется?
Вы также можете использовать setserial для получения и установки информации о последовательном порте в дополнение к dmesg .
Проверено на Ubuntu 18.04:
setserial # установите его судо подходящее обновление sudo apt установить setserial # Отображение (и сортировка) серийной информации для всех /dev/ttyS* устройств setserial -g /dev/ttyS* | сортировать -V # Отображение (и сортировка) серийной информации для всех /dev/ttyUSB* устройств setserial -g /dev/ttyUSB* | сортировать -V # Чтобы увидеть дополнительную информацию. например, скорость передачи, добавьте `-G`: setserial -g -G /dev/ttyS* | сортировать -V setserial -g -G /dev/ttyUSB* | сортировать -V
Пример запуска и вывода. Обратите внимание, что /dev/ttyS4 — единственный порт, который кажется активным, а не «неизвестным» (что бы это ни значило).
(Это устройство /dev/ttyS4 также отображается в Arduino IDE, хотя это не Arduino, и я не знаю, что это такое.):
$ setserial -g -G /dev/ttyS* | сортировать -V /dev/ttyS0 UART неизвестный порт 0x03f8 irq 4 baud_base 115200 spd_normal skip_test /dev/ttyS1 UART неизвестный порт 0x02f8 irq 3 baud_base 115200 spd_normal skip_test /dev/ttyS2 UART неизвестный порт 0x03e8 irq 4 baud_base 115200 spd_normal skip_test /dev/ttyS3 UART неизвестный порт 0x02e8 irq 3 baud_base 115200 spd_normal /dev/ttyS4 UART 16550A порт 0x3060 irq 19baud_base 115200 spd_normal skip_test /dev/ttyS5 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS6 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS7 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS8 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS9 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS10 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS11 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS12 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS13 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS14 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS15 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS16 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS17 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS18 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS19UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS20 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS21 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS22 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS23 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS24 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS25 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS26 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS27 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS28 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS29UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS30 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS31 UART неизвестный порт 0x0000 irq 0 baud_base 0 spd_normal
dmesg Используйте dmesg , чтобы также увидеть часть этой информации:# Показать информацию UART, вкл.скорость передачи данных для устройств /dev/ttyS*. dmesg | grep ttyS # Показать информацию UART, в т.ч. скорость передачи данных для устройств /dev/ttyUSB*. dmesg | grep ttyUSB
Пример запуска и вывода:
$ dmesg | grep ttyS [ 1.624447] 0000:00:16.3: ttyS4 при вводе-выводе 0x3060 (irq = 19, base_baud = 115200) — это 16550A
Еще лучше, смотреть dmesg вывод кольцевого буфера ядра live с опцией -w :
dmesg -wH
Теперь отключите USB-устройство, которое вы пытаетесь идентифицировать, и снова подключите его, чтобы увидеть, что это за устройство, основываясь на сообщениях, которые отображаются в выводе dmesg , live .
usb — найти последовательный порт
Я использую преобразователь для отправки некоторых строковых данных на порт USB. Как найти номер порта COM для подключенного устройства? Например в этой программе:
импортировать серийный номер ComPort = serial.Serial('COM24') # открыть COM24 ComPort.скорость = 9600 ComPort.bytesize = 8
COM24 мой порт. Но как я могу найти правильный номер ком-порта?
- USB
- последовательный порт
Многие дистрибутивы Linux (обычно Debian и его производные) имеют каталог /dev/serial/by-id . Это показывает полное «аппаратное» имя последовательного USB-устройства. Смотрите этот каталог при подключении и отключении, чтобы идентифицировать ваше устройство.
Создайте символическую ссылку между этим полным именем и каким-нибудь коротким удобным именем в домашнем каталоге пользователя. Этот полный путь (/home/me/myserial) является «com-портом» для использования в программах. Это стабильно при подключении/отключении/перезагрузке из-за символической ссылки.
Пример:
my@host:~$ ls -lA /dev/serial/by-id всего 0 lrwxrwxrwx 1 root root 13 11 июня 07:21 usb-FTDI_FT232R_USB_UART_ANZ1SMDF-if00-port0 -> ../../ttyUSB2 my@host:~$ ln -s /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_ANZ1SMDF-if00-port0 /home/me/myserial
Это создает символическую ссылку: /home/me/myserial , которая указывает на преобразователь USB/Serial всякий раз, когда он подключен к хосту.
скорость передачи данных для устройств /dev/ttyS*.
dmesg | grep ttyS
# Показать информацию UART, в т.ч. скорость передачи данных для устройств /dev/ttyUSB*.
dmesg | grep ttyUSB
Serial('COM24') # открыть COM24
ComPort.скорость = 9600
ComPort.bytesize = 8