Serial Port: различия между версиями
Garik (обсуждение | вклад) |
|||
(не показано 40 промежуточных версий 4 участников) | |||
Строка 1: | Строка 1: | ||
<languages/> | |||
<translate> | |||
== Последовательные порты и их реализация в Linux == <!--T:1--> | |||
<!--T:2--> | |||
Монументальное описание последовательных портов - http://www.tldp.org/HOWTO/Serial-HOWTO.html. Краткий неточный пересказ: | |||
* в последовательный порт можно посылать данные и получать оттуда данные; | |||
* в Linux последовательные порты представлены в виде псевдофайлов из папки ''/dev/'', например, в Wiren Board это могут быть ''/dev/ttyAPP0'', ''/dev/ttyNSC1'', ''/dev/ttyUSB0'' (у всех в названии есть ''tty''). | |||
<!--T:5--> | |||
Перед тем, как начать работать с портом, надо настроить его скорость и другие параметры в зависимости от того, какое устройство к нему подключено: | |||
* скорость в битах в секунду. Самое популярное значение 115200; | |||
* количество бит в символе, чётность, количество стоп-битов. Самая популярная конфигурация называется ''8N1'' - восемь бит в символе, проверки чётности нет, один стоп-бит; | |||
* аппаратный и программный контроль потока. Если не знаете, поставьте "нет" в обоих настройках. | |||
== Определение занят ли порт и монопольное использование == <!--T:6--> | |||
<syntaxhighlight lang=" | Работать с последовательным портом может (обычно) только один процесс. | ||
# | Если порт "занят" - то попытка передать/получить через него обычно неудачна. | ||
Для того чтобы определить кто занял порт, можно использовать lsof/ | |||
Сначала установим: | |||
apt install lsof -y | |||
Потом запустим с именем интересующего нас файла (устройства): | |||
lsof /dev/ttyRS485-2 | |||
Если вывод пуст - порт свободен. Если нет - то будет показан занявший процесс. | |||
Порты /dev/ttyRS485-1 и /dev/ttyRS485-2 (если есть сконфигурированные на них устройства) обычно заняты сервисом wb-mqtt-serial | |||
Чтобы его остановить на время работы с портом нужно выполнить: | |||
systemctl stop wb-mqtt-serial | |||
Для запуска: | |||
systemctl start wb-mqtt-serial | |||
Либо отключить порт в конфигурации wb-mqtt-serial сняв галочку "Enable port" (Не забудьте сохранить кнопкой "Save" вверху). | |||
[[Файл:Enable-disable serial port.png|200px|thumb|right|Отключение порта]] | |||
== serial_tool - утилита для отправки и получения наборов бит == <!--T:6--> | |||
<!--T:7--> | |||
Чтобы отправлять и получать данные в шестнадцатеричном формате (то есть фактически побитово, группами по четыре бита), используйте утилиту [https://github.com/contactless/serial_tool serial_tool]. Она предустановлена на контроллерах Wiren Board. | |||
<!--T:9--> | |||
<syntaxhighlight lang="bash"> | |||
root@wirenboard:~# serial_tool -h | |||
usage: serial_tool [-h] [-b BAUD] [-p PARITY] [-d DATA_BITS] [-s STOP_BITS] | |||
[-t READ_TIMEOUT] | |||
port | |||
serial_tool - interactive hex serial port console | |||
positional arguments: | |||
port Serial port to open, i.e. /dev/ttyXXX | |||
optional arguments: | |||
-h, --help show this help message and exit | |||
-b BAUD, --baud BAUD Baud rate (default: 9600) | |||
-p PARITY, --parity PARITY | |||
set parity, one of [N, E, O, M, S] (default: N) | |||
-d DATA_BITS, --data-bits DATA_BITS | |||
set number of data bits, i.e. bytesize (default: 8) | |||
-s STOP_BITS, --stop-bits STOP_BITS | |||
set number of stop bits, one of [1, 1.5, 2] (default: | |||
1) | |||
-t READ_TIMEOUT, --timeout READ_TIMEOUT | |||
number of seconds to wait for answer (default: 1) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Пример использования:<!--T:13--> | |||
<!--T:14--> | |||
<pre> | |||
root@wirenboard:~# serial_tool -b 9600 -p N -d 8 -s 2 -t 1 /dev/ttyNSC1 | |||
serial_tool on /dev/ttyNSC1: 9600 8N2.0 | |||
Enter your commands below in HEX form. | |||
All characters but 0-9,a-f including spaces are ignored. | |||
Press Control-D or Control-C to leave the application. | |||
Press [Enter] to print received data | |||
>> FF FF 0A 01 11 00 00 1C | |||
<< FF FF 0A 00 11 00 00 1B | |||
</pre> | |||
Здесь установлены настройки 9600 8N2, таймаут 1 секунда, порт /dev/ttyNSC1 (RS-485). | |||
== minicom - утилита для отправки и получения символьных команд == <!--T:15--> | |||
<!--T:16--> | |||
Самая удобная утилита для работы с последовательным портом из консоли - '''minicom''' (есть в стандартном образе Wiren Board). | |||
Minicom удобно пользоваться для работы с устройстами, которые управляются текстовыми командами или выводят текстовые сообщения. Примерами таких устройств являются GSM-модемы (управляются AT-командами), в том числе встроенный в Wiren Board GSM-модуль; GPS-модули, работающие по протоколу NMEA и т.п. | |||
<!--T:17--> | |||
Краткая инструкция (считаем, что мы будем работать с портом /dev/ttyAPP0): | |||
* В первый раз запускаем '''minicom''' с ключом, создающим профиль работы с портом (в нём хранятся номер порта, скорость передачи данных, чётность, и т.д.): | |||
<pre> | |||
$ minicom -s /dev/ttyAPP0 | |||
</pre> | |||
* Зайти в настройки (нажать ''Ctrl+A'', затем ''O''), выбрать пункт ''Serial port setup'', там установить порт ''/dev/ttyAPP0'', скорость и чётность - ''115200, 8N1'', ''Hardware flow control - No'', ''Software flow control - No'' | |||
* Сохранить настройки: ''Save setup as _dev_ttyAPP0'' | |||
* Далее запускать как: | |||
<pre> | |||
$ minicom /dev/ttyAPP0 | |||
</pre> | |||
(все параметры будут сразу браться из профиля с названием ''/dev/ttyAPP0'', который мы ранее создали) | |||
* Теперь можно вводить данные, которые вы хотите отправить в порт. Приходящие в порт данные от внешних устройств также будут выводиться | |||
== modbus_client - утилита для работы с устройствами Modbus RTU и TCP == <!--T:19--> | |||
<!--T:20--> | |||
Подробнее смотрите в статье [[Special:MyLanguage/modbus-client|modbus_client]]. | |||
== Работа с последовательным портом из своей программы == <!--T:21--> | |||
< | <!--T:22--> | ||
http://tldp.org/HOWTO/Serial-Programming-HOWTO/ | |||
</translate> | |||
</ |
Версия 10:41, 31 августа 2020
Последовательные порты и их реализация в Linux
Монументальное описание последовательных портов - http://www.tldp.org/HOWTO/Serial-HOWTO.html. Краткий неточный пересказ:
- в последовательный порт можно посылать данные и получать оттуда данные;
- в Linux последовательные порты представлены в виде псевдофайлов из папки /dev/, например, в Wiren Board это могут быть /dev/ttyAPP0, /dev/ttyNSC1, /dev/ttyUSB0 (у всех в названии есть tty).
Перед тем, как начать работать с портом, надо настроить его скорость и другие параметры в зависимости от того, какое устройство к нему подключено:
- скорость в битах в секунду. Самое популярное значение 115200;
- количество бит в символе, чётность, количество стоп-битов. Самая популярная конфигурация называется 8N1 - восемь бит в символе, проверки чётности нет, один стоп-бит;
- аппаратный и программный контроль потока. Если не знаете, поставьте "нет" в обоих настройках.
Определение занят ли порт и монопольное использование
Работать с последовательным портом может (обычно) только один процесс. Если порт "занят" - то попытка передать/получить через него обычно неудачна. Для того чтобы определить кто занял порт, можно использовать lsof/ Сначала установим:
apt install lsof -y
Потом запустим с именем интересующего нас файла (устройства):
lsof /dev/ttyRS485-2
Если вывод пуст - порт свободен. Если нет - то будет показан занявший процесс.
Порты /dev/ttyRS485-1 и /dev/ttyRS485-2 (если есть сконфигурированные на них устройства) обычно заняты сервисом wb-mqtt-serial Чтобы его остановить на время работы с портом нужно выполнить:
systemctl stop wb-mqtt-serial
Для запуска:
systemctl start wb-mqtt-serial
Либо отключить порт в конфигурации wb-mqtt-serial сняв галочку "Enable port" (Не забудьте сохранить кнопкой "Save" вверху).
serial_tool - утилита для отправки и получения наборов бит
Чтобы отправлять и получать данные в шестнадцатеричном формате (то есть фактически побитово, группами по четыре бита), используйте утилиту serial_tool. Она предустановлена на контроллерах Wiren Board.
root@wirenboard:~# serial_tool -h
usage: serial_tool [-h] [-b BAUD] [-p PARITY] [-d DATA_BITS] [-s STOP_BITS]
[-t READ_TIMEOUT]
port
serial_tool - interactive hex serial port console
positional arguments:
port Serial port to open, i.e. /dev/ttyXXX
optional arguments:
-h, --help show this help message and exit
-b BAUD, --baud BAUD Baud rate (default: 9600)
-p PARITY, --parity PARITY
set parity, one of [N, E, O, M, S] (default: N)
-d DATA_BITS, --data-bits DATA_BITS
set number of data bits, i.e. bytesize (default: 8)
-s STOP_BITS, --stop-bits STOP_BITS
set number of stop bits, one of [1, 1.5, 2] (default:
1)
-t READ_TIMEOUT, --timeout READ_TIMEOUT
number of seconds to wait for answer (default: 1)
Пример использования:
root@wirenboard:~# serial_tool -b 9600 -p N -d 8 -s 2 -t 1 /dev/ttyNSC1 serial_tool on /dev/ttyNSC1: 9600 8N2.0 Enter your commands below in HEX form. All characters but 0-9,a-f including spaces are ignored. Press Control-D or Control-C to leave the application. Press [Enter] to print received data >> FF FF 0A 01 11 00 00 1C << FF FF 0A 00 11 00 00 1B
Здесь установлены настройки 9600 8N2, таймаут 1 секунда, порт /dev/ttyNSC1 (RS-485).
minicom - утилита для отправки и получения символьных команд
Самая удобная утилита для работы с последовательным портом из консоли - minicom (есть в стандартном образе Wiren Board). Minicom удобно пользоваться для работы с устройстами, которые управляются текстовыми командами или выводят текстовые сообщения. Примерами таких устройств являются GSM-модемы (управляются AT-командами), в том числе встроенный в Wiren Board GSM-модуль; GPS-модули, работающие по протоколу NMEA и т.п.
Краткая инструкция (считаем, что мы будем работать с портом /dev/ttyAPP0):
- В первый раз запускаем minicom с ключом, создающим профиль работы с портом (в нём хранятся номер порта, скорость передачи данных, чётность, и т.д.):
$ minicom -s /dev/ttyAPP0
- Зайти в настройки (нажать Ctrl+A, затем O), выбрать пункт Serial port setup, там установить порт /dev/ttyAPP0, скорость и чётность - 115200, 8N1, Hardware flow control - No, Software flow control - No
- Сохранить настройки: Save setup as _dev_ttyAPP0
- Далее запускать как:
$ minicom /dev/ttyAPP0
(все параметры будут сразу браться из профиля с названием /dev/ttyAPP0, который мы ранее создали)
- Теперь можно вводить данные, которые вы хотите отправить в порт. Приходящие в порт данные от внешних устройств также будут выводиться
modbus_client - утилита для работы с устройствами Modbus RTU и TCP
Подробнее смотрите в статье modbus_client.