Перейти к содержанию

Навигация

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

Переписал
м (A.Degtyarev переименовал страницу Working with serial port в Serial Port без оставления перенаправления: Часть переводимой страницы Working with serial port.)
(Переписал)
Строка 1: Строка 1:
<languages/>
{{DISPLAYTITLE: Работа с последовательным портом }}
<translate>


== Последовательные порты и их реализация в Linux == <!--T:1-->
== Реализация последовательных портов в ОС Linux ==
=== Основы ===
{{note|note| Последовательный порт ещё называют serial-портом.}}
Полное описание читайте в [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>.


<!--T:2-->
Перед началом работы с serial-портом, настройте его скорость и параметры так же как настроено подключённое к нему устройство:
Монументальное описание последовательных портов - http://www.tldp.org/HOWTO/Serial-HOWTO.html. Краткий неточный пересказ:
* Скорость в битах в секунду, самое популярное — 115200 бит/с.
* в последовательный порт можно посылать данные и получать оттуда данные;
* Количество бит в символе, чётность и количество стоп-битов. Популярна конфигурация 8N1 — восемь бит в символе, без проверки чётности, один стоп-бит.
* в Linux последовательные порты представлены в виде псевдофайлов из папки ''/dev/'', например, в Wiren Board это могут быть ''/dev/ttyAPP0'', ''/dev/ttyNSC1'', ''/dev/ttyUSB0'' (у всех в названии есть ''tty'').
* Аппаратный и программный контроль потока — если не уверены, то поставьте «Нет» в обоих параметрах.


<!--T:5-->
=== Определение занятости порта и монопольное использование ===
Перед тем, как начать работать с портом, надо настроить его скорость и другие параметры в зависимости от того, какое устройство к нему подключено:
[[Image: Enable-disable serial port.png |300px|thumb|right| Отключение serial-порта в веб-интерфейсе контроллера Wiren Board ]]
* скорость в битах в секунду. Самое популярное значение 115200;
* количество бит в символе, чётность, количество стоп-битов. Самая популярная конфигурация называется ''8N1'' - восемь бит в символе, проверки чётности нет, один стоп-бит;
* аппаратный и программный контроль потока. Если не знаете, поставьте "нет" в обоих настройках.


== Определение занят ли порт и монопольное использование == <!--T:6-->
Обычно, работать с serial-портом может только один процесс. Если порт «занят», то попытка передать или получить через него данные не удастся.
Работать с последовательным портом может (обычно) только один процесс.
Если порт "занят" - то попытка передать/получить через него обычно неудачна.
Для того чтобы определить кто занял порт, можно использовать fuser
Запустим с именем интересующего нас файла (устройства):
  fuser /dev/ttyRS485-2
Если вывод пуст - порт свободен. Если нет - то будет показан занявший процесс.


Порты /dev/ttyRS485-1 и /dev/ttyRS485-2 (если есть сконфигурированные на них устройства) обычно заняты сервисом wb-mqtt-serial
Используйте команду fuser для того, чтобы определить, свободен ли порт. В качестве параметра передайте порт, который нужно проверить.  
Чтобы его остановить на время работы с портом нужно выполнить:
  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-->
Проверим, свободен ли порт <code> /dev/ttyRS485-2</code>. Для этого выполните команду:
<syntaxhighlight lang="bash">
fuser /dev/ttyRS485-1
</syntaxhighlight>
Если вывод пуст — порт свободен. Иначе будет выведен процесс, который занимает порт.
 
В контроллерах 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 — утилита для отправки и получения наборов бит. Используйте её для отправки и получения данных в шестнадцатеричном формате: побитово, группами по четыре бита.


<!--T:7-->
Утилита serial_tool предустановлена на все контроллеры Wiren Board. На компьютеры с Linux её нужно установить из [https://github.com/wirenboard/serial_tool нашего репозитория].
Чтобы отправлять и получать данные в шестнадцатеричном формате (то есть фактически побитово, группами по четыре бита), используйте утилиту [https://github.com/contactless/serial_tool serial_tool]. Она предустановлена на контроллерах Wiren Board.


<!--T:9-->
Для вызова справки по утилите, запустите утилиту с параметром <code>-h</code>:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
root@wirenboard:~# serial_tool -h
~# serial_tool -h
usage: serial_tool [-h] [-b BAUD] [-p PARITY] [-d DATA_BITS] [-s STOP_BITS]
usage: serial_tool [-h] [-b BAUD] [-p PARITY] [-d DATA_BITS] [-s STOP_BITS]
                   [-t READ_TIMEOUT]
                   [-t READ_TIMEOUT]
Строка 62: Строка 66:
</syntaxhighlight>
</syntaxhighlight>


Пример использования:<!--T:13-->
Например, запишем последовательность бит в порт /dev/ttyRS485-1 с параметрами порта 8N2 и таймаутом в одну секунду:
 
<syntaxhighlight lang="bash">
<!--T:14-->
~# serial_tool -b 9600 -p N -d 8 -s 2 -t 1 /dev/ttyRS485-1
<pre>
serial_tool on /dev/ttyRS485-1: 9600 8N2.0
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.  
Enter your commands below in HEX form.  
All characters but 0-9,a-f including spaces are ignored.
All characters but 0-9,a-f including spaces are ignored.
Строка 74: Строка 76:
>> FF FF 0A 01 11 00 00 1C
>> FF FF 0A 01 11 00 00 1C
<< FF FF 0A 00 11 00 00 1B
<< FF FF 0A 00 11 00 00 1B
</pre>
</syntaxhighlight>
Здесь установлены настройки 9600 8N2, таймаут 1 секунда, порт /dev/ttyNSC1 (RS-485).
 
Другие примеры использования утилиты смотрите в статьях о настройке приводов штор, например, [[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>


== minicom - утилита для отправки и получения символьных команд == <!--T:15-->
Чтобы отправить команды serial-устройству — вводите их в терминале и нажимайте клавишу <kbd>Enter</kbd>.


<!--T:16-->
Для вызова справки зажмите одновременно клавиши <kbd>Ctrl</kbd>+<kbd>A</kbd>, а затем клавишу <kbd>A</kbd>.
Самая удобная утилита для работы с последовательным портом из консоли - '''minicom''' (есть в стандартном образе Wiren Board).
Minicom удобно пользоваться для работы с устройствами, которые управляются текстовыми командами или выводят текстовые сообщения.  Примерами таких устройств являются GSM-модемы (управляются AT-командами), в том числе встроенный в Wiren Board GSM-модуль; GPS-модули, работающие по протоколу NMEA и т.п.


<!--T:17-->
Чтобы выйти из minicom — нажмите одновременно клавиши <kbd>Ctrl</kbd>+<kbd>A</kbd>, а затем клавишу <kbd>X</kbd>.
Краткая инструкция (считаем, что мы будем работать с портом /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-->
=== PuTTY ===
Об использовании PuTTY для подключения к serial-порту читайте в [[статье PuTTY]].


<!--T:20-->
=== Протокол Modbus RTU ===
Подробнее смотрите в статье [[Special:MyLanguage/modbus-client|modbus_client]].
Если serial-устройство поддерживает протокол Modbus RTU, то вы можете работать с ним с помощью утилиты [[modbus_client]].


== Работа с последовательным портом из своей программы == <!--T:21-->
=== Собственное ПО ===
Если вы пишете скрипт или свою программу для работы с serial-портом, то руководствуйтесь советами из [https://tldp.org/HOWTO/Serial-Programming-HOWTO/ Serial-Programming-HOWTO].


<!--T:22-->
== Утилита для ОС Windows ==
http://tldp.org/HOWTO/Serial-Programming-HOWTO/
Об использовании PuTTY для подключения к serial-порту в ОС Windows читайте в [[PuTTY | статье PuTTY]].
</translate>