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

Материал из Wiren Board
 
(не показано 25 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE: Работа с последовательным портом }}
{{DISPLAYTITLE: Работа с последовательным портом (serial-портом)}}
== Реализация последовательных портов в ОС Linux ==
== Serial-порты в контроллере Wiren Board ==
=== Основы ===
=== Реализация ===
{{note|note| Последовательный порт ещё называют serial-портом.}}
Полное описание читайте в [http://www.tldp.org/HOWTO/Serial-HOWTO.html документации], вот выжимка из неё:
Полное описание читайте в [http://www.tldp.org/HOWTO/Serial-HOWTO.html документации], вот выжимка из неё:
* В serial-порт можно посылать данные и получать данные из него.
* В serial-порт можно посылать данные и получать данные из него.
Строка 8: Строка 7:


Перед началом работы с serial-портом, настройте его скорость и параметры так же как настроено подключённое к нему устройство:
Перед началом работы с serial-портом, настройте его скорость и параметры так же как настроено подключённое к нему устройство:
* Скорость в битах в секунду, самое популярное — 115200 бит/с.
* Скорость в битах в секунду, самое популярное — 9600 бит/с.
* Количество бит в символе, чётность и количество стоп-битов. Популярна конфигурация 8N1 — восемь бит в символе, без проверки чётности, один стоп-бит.
* Количество бит в символе, чётность и количество стоп-битов. Популярна конфигурация 8N1 — восемь бит в символе, без проверки чётности, один стоп-бит.
* Аппаратный и программный контроль потока — если не уверены, то поставьте «Нет» в обоих параметрах.
* Аппаратный и программный контроль потока — если не уверены, то поставьте «Нет» в обоих параметрах.
Строка 14: Строка 13:
=== Определение занятости порта и монопольное использование ===
=== Определение занятости порта и монопольное использование ===
[[Image: Enable-disable serial port.png |300px|thumb|right| Отключение serial-порта в веб-интерфейсе контроллера Wiren Board ]]
[[Image: Enable-disable serial port.png |300px|thumb|right| Отключение serial-порта в веб-интерфейсе контроллера Wiren Board ]]
Обычно, работать с serial-портом может только один процесс. Если порт «занят», то попытка передать или получить через него данные не удастся.
Обычно, работать с serial-портом может только один процесс. Если порт «занят», то попытка передать или получить через него данные не удастся.


Строка 20: Строка 18:


Проверим, свободен ли порт <code> /dev/ttyRS485-2</code>. Для этого выполните команду:
Проверим, свободен ли порт <code> /dev/ttyRS485-2</code>. Для этого выполните команду:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
fuser /dev/ttyRS485-1
# fuser -v /dev/ttyRS485-1
                    USER        PID ACCESS COMMAND
/dev/ttyS2:          root      32296 F.... wb-mqtt-serial
</syntaxhighlight>
</syntaxhighlight>
Если вывод пуст — порт свободен. Иначе будет выведен процесс, который занимает порт.
Если вывод пуст — порт свободен. Иначе будет выведен процесс, который занимает порт. В примере выше порт занят драйвером wb-mqtt-serial.
 
В контроллерах Wiren Board порты <code>/dev/ttyRS485-1</code> и <code>/dev/ttyRS485-2</code> обычно заняты драйвером <code>wb-mqtt-serial</code>. Перед работой с этими портами — остановите драйвер.
 
Драйвер можно остановить одним из способов:
# [[wb-mqtt-serial#Управление драйвером | Остановите драйвер из командной строки]]
# В [[RS-485:Configuration via Web Interface | веб-интерфейсе]] контроллера, в настройках serial-порта снимите галочку «Enabled» и сохраните настройки.
 
== Утилиты для ОС Linux ==
=== Serial_tool ===
[[Image: Akko setting address.png |300px|thumb|right| Пример работы с утилитой serial_tool ]]
 
Serial_tool — утилита для отправки и получения наборов бит. Используйте её для отправки и получения данных в шестнадцатеричном формате: побитово, группами по четыре бита.
 
Утилита serial_tool предустановлена на все контроллеры Wiren Board. На компьютеры с Linux её нужно установить из [https://github.com/wirenboard/serial_tool нашего репозитория].
 
Для вызова справки по утилите, запустите утилиту с параметром <code>-h</code>:
<syntaxhighlight lang="bash">
~# 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>
 
Например, запишем последовательность бит в порт /dev/ttyRS485-1 с параметрами порта 8N2 и таймаутом в одну секунду:
<syntaxhighlight lang="bash">
~# serial_tool -b 9600 -p N -d 8 -s 2 -t 1 /dev/ttyRS485-1
serial_tool on /dev/ttyRS485-1: 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
</syntaxhighlight>
 
Другие примеры использования утилиты смотрите в статьях о настройке приводов штор, например, [[Akko AM82]].
 
=== Minicom ===
Minicom — утилита для отправки и получения символьных команд. Её удобно использовать для работы с устройствами, которые управляются текстовыми командами и выводят текстовые сообщения в ответ. Например, c помощью minicom удобно отправлять AT-команды на GSM-модемы или получать данные с GPS-модулей, которые работают по протоколу NMEA.
 
Утилита minicom предустановлена на все контроллеры Wiren Board, а на ПК с ОС Linux её нужно будет установить. Для установки minicom на ПК с ОС Linux, выполните поочереди команды:
<syntaxhighlight lang="bash">
sudo apt update
sudo apt install minicom
</syntaxhighlight>
 
Для запуска minicom нужны права суперпользователя, на контроллерах Wiren Board вы уже работаете под суперпользователем, а на ПК с ОС Linux используйте <code>sudo</code>.
 
==== Настройка параметров подключения ====
[[Image: Minicom settings.png |300px|thumb|right| Пример настройки параметров подключения в minicom ]]
Для настройки параметров подключения, запустите утилиту с ключом -s и укажите имя профиля, в который хотите сохранить настройки.
 
Например, настроим соединение с портом <code>/dev/ttyGSM</code>:
# Запустите minicom от имени суперпользователя в режиме настройки соединения и укажите имя профиля, например, '''ttyGSM''':
#: <syntaxhighlight lang="bash">
minicom -s ttyGSM
</syntaxhighlight>
# В появившемся меню '''Configuration''', выберите пункт '''Serial port setup'''.
# Теперь выберите нужные пункты нажатием соответствующих клавиш на клавиатуре, меняйте настройки и каждое изменение подтверждайте клавишей <kbd>Enter</kbd>:
#* <kbd>A</kbd> — введите имя serial-порта: <code>/dev/ttyGSM</code>.
#* <kbd>E</kbd> — откроется окно '''Comm Parameters''', в котором нужно указать:
## Скорость соединения, секция '''Speed''' — выберите <kbd>E</kbd> — 115200.
## Количество бит в символе, секция '''Data''' — выберите <kbd>V</kbd> — 8 бит.
## Проверка чётности, секция Parity — выберите <kbd>L</kbd> — None.
## Стоп-биты, секция '''Stopbits''' — выберите <kbd>W</kbd> — 1 стоп-бит.
#* '''Hardware flow control''' (аппаратный контроль потока) — клавиша <kbd>F</kbd> переключает состояние, выберите '''No'''.
#* '''Software flow control''' (программный контроль потока) — клавиша <kbd>G</kbd> переключает состояние, выберите '''No'''.
# Выйдете из настроек порта в главное меню, для этого нажмите на клавиатуре клавишу <kbd>Enter</kbd>.
# Сохраните настройки в профиль, для этого выберите '''Save Setup as ttyGSM'''.
# Закройте minicom, для этого выберите в меню пункт '''Exit from Minicom'''.
 
==== Запуск с сохранёнными настройками ====
В предыдущем пункте мы создали профиль настроек, теперь мы можем запустить minicom с этим профилем:
<syntaxhighlight lang="bash">
~# minicom ttyGSM
 
Welcome to minicom 2.7
 
OPTIONS: I18n
Compiled on Apr 22 2017, 09:14:19.
Port /dev/ttyGSM, 10:03:25
 
Press CTRL-A Z for help on special keys
</syntaxhighlight>
 
Чтобы отправить команды serial-устройству — вводите их в терминале и нажимайте клавишу <kbd>Enter</kbd>.
 
Для вызова справки зажмите одновременно клавиши <kbd>Ctrl</kbd>+<kbd>A</kbd>, а затем клавишу <kbd>A</kbd>.
 
Чтобы выйти из minicom — нажмите одновременно клавиши <kbd>Ctrl</kbd>+<kbd>A</kbd>, а затем клавишу <kbd>X</kbd>.


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


=== Протокол Modbus RTU ===
== Программы для работы с serial-портом ==
Если serial-устройство поддерживает протокол Modbus RTU, то вы можете работать с ним с помощью утилиты [[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] и другие аналогичные программы.


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


== Утилита для ОС Windows ==
<gallery mode="traditional" widths="250px"  caption="Примеры работы с serial-портом в различных программах">
Об использовании PuTTY для подключения к serial-порту в ОС Windows читайте в [[PuTTY | статье PuTTY]].
Image: Akko setting address.png |Отправка команд через [[serial_tool]]
Image: Minicom-AT-4G.png | Отправка AT-команд в программе [[minicom]]
Image: Putty serial logged in.png | Работа с Debug-консолью в [[PuTTY]]
</gallery>

Текущая версия на 08:30, 13 апреля 2023

Serial-порты в контроллере Wiren Board

Реализация

Полное описание читайте в документации, вот выжимка из неё:

  • В serial-порт можно посылать данные и получать данные из него.
  • В ОС Linux serial-порты — это псевдофайлы из папки /dev. Например, в контроллерах Wiren Board это могут быть /dev/ttyGSM, /dev/ttyRS485-1, /dev/ttyUSB0 — у всех в названии есть tty.

Перед началом работы с serial-портом, настройте его скорость и параметры так же как настроено подключённое к нему устройство:

  • Скорость в битах в секунду, самое популярное — 9600 бит/с.
  • Количество бит в символе, чётность и количество стоп-битов. Популярна конфигурация 8N1 — восемь бит в символе, без проверки чётности, один стоп-бит.
  • Аппаратный и программный контроль потока — если не уверены, то поставьте «Нет» в обоих параметрах.

Определение занятости порта и монопольное использование

Отключение serial-порта в веб-интерфейсе контроллера Wiren Board

Обычно, работать с serial-портом может только один процесс. Если порт «занят», то попытка передать или получить через него данные не удастся.

Используйте команду fuser для того, чтобы определить, свободен ли порт. В качестве параметра передайте порт, который нужно проверить.

Проверим, свободен ли порт /dev/ttyRS485-2. Для этого выполните команду:

# fuser -v /dev/ttyRS485-1
                     USER        PID ACCESS COMMAND
/dev/ttyS2:          root      32296 F.... wb-mqtt-serial

Если вывод пуст — порт свободен. Иначе будет выведен процесс, который занимает порт. В примере выше порт занят драйвером wb-mqtt-serial.

В контроллерах Wiren Board порты /dev/ttyRS485-1 и /dev/ttyRS485-2 обычно заняты драйвером wb-mqtt-serial. Перед работой с этими портами — остановите драйвер одним из способов:

Программы для работы с serial-портом

Программы для разных ОС:

Дополнительно:

  • Если вы не можете использовать программы из этой статьи — посмотрите этот список.
  • Если serial-устройство поддерживает протокол Modbus RTU, то вы можете работать с ним с помощью утилиты modbus_client.
  • Вы пишете скрипт или свою программу для работы с serial-портом — руководствуйтесь советами из Serial-Programming-HOWTO.