Serial Port: различия между версиями

Материал из Wiren Board
(не показано 38 промежуточных версий 4 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE: Работа с последовательным портом (serial-портом)}}
<languages/>
== Serial-порты в контроллере Wiren Board ==
<translate>
=== Реализация ===
Полное описание читайте в [http://www.tldp.org/HOWTO/Serial-HOWTO.html документации], вот выжимка из неё:
* В serial-порт можно посылать данные и получать данные из него.
* В ОС Linux serial-порты — это псевдофайлы из папки <code>/dev</code>. Например, в контроллерах Wiren Board это могут быть <code>/dev/ttyGSM</code>, <code>/dev/ttyRS485-1</code>, <code>/dev/ttyUSB0</code> — у всех в названии есть <code>tty</code>.


Перед началом работы с serial-портом, настройте его скорость и параметры так же как настроено подключённое к нему устройство:
== Последовательные порты и их реализация в Linux == <!--T:1-->
* Скорость в битах в секунду, самое популярное — 9600 бит/с.
* Количество бит в символе, чётность и количество стоп-битов. Популярна конфигурация 8N1 — восемь бит в символе, без проверки чётности, один стоп-бит.
* Аппаратный и программный контроль потока — если не уверены, то поставьте «Нет» в обоих параметрах.


=== Определение занятости порта и монопольное использование ===
<!--T:2-->
[[Image: Enable-disable serial port.png |300px|thumb|right| Отключение serial-порта в веб-интерфейсе контроллера Wiren Board ]]
Монументальное описание последовательных портов - http://www.tldp.org/HOWTO/Serial-HOWTO.html. Краткий неточный пересказ:
Обычно, работать с serial-портом может только один процесс. Если порт «занят», то попытка передать или получить через него данные не удастся.
* в последовательный порт можно посылать данные и получать оттуда данные;
* в Linux последовательные порты представлены в виде псевдофайлов из папки ''/dev/'', например, в Wiren Board это могут быть ''/dev/ttyAPP0'', ''/dev/ttyNSC1'', ''/dev/ttyUSB0'' (у всех в названии есть ''tty'').


Используйте команду fuser для того, чтобы определить, свободен ли порт. В качестве параметра передайте порт, который нужно проверить.  
<!--T:5-->
Перед тем, как начать работать с портом, надо настроить его скорость и другие параметры в зависимости от того, какое устройство к нему подключено:
* скорость в битах в секунду. Самое популярное значение 115200;
* количество бит в символе, чётность, количество стоп-битов. Самая популярная конфигурация называется ''8N1'' - восемь бит в символе, проверки чётности нет, один стоп-бит;
* аппаратный и программный контроль потока. Если не знаете, поставьте "нет" в обоих настройках.


Проверим, свободен ли порт <code> /dev/ttyRS485-2</code>. Для этого выполните команду:
== Определение занят ли порт и монопольное использование == <!--T:6-->
<syntaxhighlight lang="console">
Работать с последовательным портом может (обычно) только один процесс.
# fuser -v /dev/ttyRS485-1
Если порт "занят" - то попытка передать/получить через него обычно неудачна.
                    USER        PID ACCESS COMMAND
Для того чтобы определить кто занял порт, можно использовать lsof/
/dev/ttyS2:         root      32296 F.... wb-mqtt-serial
Сначала установим:
  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>
Если вывод пуст — порт свободен. Иначе будет выведен процесс, который занимает порт. В примере выше порт занят драйвером wb-mqtt-serial.


В контроллерах Wiren Board порты <code>/dev/ttyRS485-1</code> и <code>/dev/ttyRS485-2</code> обычно заняты драйвером <code>wb-mqtt-serial</code>. Перед работой с этими портами — остановите драйвер одним из способов:
Пример использования:<!--T:13-->
* [[wb-mqtt-serial#Управление драйвером | Остановить драйвер]] из командной строки.
 
* [[RS-485:Configuration via Web Interface | В веб-интерфейсе контроллера]], в настройках serial-порта снять галочку '''Enable port''' и сохранить настройки.
<!--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-->


== Программы для работы с serial-портом ==
<!--T:20-->
Программы для разных ОС:
Подробнее смотрите в статье [[Special:MyLanguage/modbus-client|modbus_client]].
* Linux: [[Serial_tool | Serial_tool]], [[Minicom | Minicom]], [[PuTTY | PuTTY]].
* Windows: [[PuTTY | PuTTY]].
* macOS: [https://www.ssh.com/ssh/putty/mac/ PuTTY for Mac OS X] или терминальный клиент <code>cu</code>: <code>cu -s 115200 -l /dev/usbmodem00001</code>
* Android: [https://play.google.com/store/apps/details?id=jp.sugnakys.usbserialconsole&hl=en_US USB Serial Console] и другие аналогичные программы.


Дополнительно:
== Работа с последовательным портом из своей программы == <!--T:21-->
* Если вы не можете использовать программы из этой статьи — посмотрите [http://elinux.org/RPi_Serial_Connection этот список].
* Если serial-устройство поддерживает протокол Modbus RTU, то вы можете работать с ним с помощью утилиты [[modbus_client]].
* Вы пишете скрипт или свою программу для работы с serial-портом — руководствуйтесь советами из [https://tldp.org/HOWTO/Serial-Programming-HOWTO/ Serial-Programming-HOWTO].


<gallery mode="traditional" widths="250px"  caption="Примеры работы с serial-портом в различных программах">
<!--T:22-->
Image: Akko setting address.png |Отправка команд через [[serial_tool]]
http://tldp.org/HOWTO/Serial-Programming-HOWTO/
Image: Minicom-AT-4G.png | Отправка AT-команд в программе [[minicom]]
</translate>
Image: Putty serial logged in.png | Работа с Debug-консолью в [[PuTTY]]
</gallery>

Версия 10:43, 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.

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

http://tldp.org/HOWTO/Serial-Programming-HOWTO/