Как узнать, какой последовательный порт используется?

Вопрос или проблема

Вопрос:

Я включил устройство (например, GSM модем) через последовательный порт (т. е. RS-232), и мне нужно узнать, с каким файлом в файловой системе /dev/ это устройство связано, чтобы иметь возможность с ним взаимодействовать. К сожалению, в /dev/ нет нового созданного файла, и в выводе dmesg ничего не видно. Это кажется сложным вопросом.

Предыстория:

Я никогда не работал с последовательным устройством, поэтому вчера, когда возникла необходимость, я попытался найти информацию в Google, но не смог найти ничего полезного. Я провел несколько часов в поисках и хочу поделиться найденным ответом, так как это может быть полезно кому-то.

К сожалению, последовательные порты не поддерживают PlugNPlay, поэтому ядро не знает, какое устройство было подключено. После прочтения HowTo я получил рабочую идею.

Директория /dev/ операционных систем, подобных Unix, содержит файлы с именами ttySn (где n – это число). Большинство из них не соответствуют существующим устройствам. Чтобы выяснить, какие из них соответствуют, выполните команду:

$ dmesg | grep ttyS
[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2
[    0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2

Выше приведен пример вывода с моего ПК. Вы можете увидеть инициализацию нескольких последовательных портов:

ttyS0, ttyS1, ttyS4, ttyS5.

Одно из них будет иметь положительное напряжение при подключении устройства. Таким образом, сравнивая содержимое файла /proc/tty/driver/serial с подключенным и отключенным устройством, мы можем легко найти ttyS, связанный с нашим устройством. Итак, теперь сделайте следующее:

$ sudo cat /proc/tty/driver/serial> /tmp/1

(отключите) подключите устройство

$ sudo cat /proc/tty/driver/serial> /tmp/2

Затем проверьте разницу между двумя файлами. Ниже приведен вывод с моего ПК:

$ diff /tmp/1 /tmp/2
2c2
< 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0
---
> 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 CTS|DSR

Сравнив три числа с выводом dmesg, мы можем определить, какой из них является портом:

[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Таким образом, наше устройство – это /dev/ttyS0, миссия выполнена!

Вы также можете использовать setserial для получения и установки информации о последовательном порте, помимо dmesg.

Проверено на Ubuntu 18.04:

setserial

# установите его
sudo apt update
sudo apt install setserial

# Отобразить (и отсортировать) информацию о последовательных устройствах для всех /dev/ttyS*
setserial -g /dev/ttyS* | sort -V
# Отобразить (и отсортировать) информацию о последовательных устройствах для всех /dev/ttyUSB*
setserial -g /dev/ttyUSB* | sort -V

# Чтобы увидеть дополнительную информацию, такую как скорость передачи данных, добавьте `-G`:
setserial -g -G /dev/ttyS* | sort -V
setserial -g -G /dev/ttyUSB* | sort -V

Пример работы и вывод. Обратите внимание, что /dev/ttyS4 – это единственный порт, который, похоже, активен и не “неизвестен” (что бы это ни значило). (Это /dev/ttyS4 устройство также отображается в Arduino IDE, хотя это не Arduino, и я не знаю, что это такое.):

$ setserial -g -G /dev/ttyS* | sort -V
/dev/ttyS0 uart unknown port 0x03f8 irq 4 baud_base 115200 spd_normal skip_test
/dev/ttyS1 uart unknown port 0x02f8 irq 3 baud_base 115200 spd_normal skip_test
/dev/ttyS2 uart unknown port 0x03e8 irq 4 baud_base 115200 spd_normal skip_test
/dev/ttyS3 uart unknown port 0x02e8 irq 3 baud_base 115200 spd_normal
/dev/ttyS4 uart 16550A port 0x3060 irq 19 baud_base 115200 spd_normal skip_test
/dev/ttyS5 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS6 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS7 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS8 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS9 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS10 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS11 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS12 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS13 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS14 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS15 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS16 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS17 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS18 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS19 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS20 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS21 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS22 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS23 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS24 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS25 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS26 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS27 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS28 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS29 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS30 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal
/dev/ttyS31 uart unknown port 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 at I/O 0x3060 (irq = 19, base_baud = 115200) is a 16550A

Ещё лучше, следите за выводом dmesg в реальном времени с помощью опции -w:

dmesg -wH

Теперь отключите ваше USB-устройство, которое вы пытаетесь идентифицировать, и снова подключите его, чтобы увидеть, какое это устройство, основываясь на сообщениях, которые появляются в выводе dmesg, в реальном времени.

Другие программы, которые также могут отображать состояния выводов, включают:

Ответ или решение

Чтобы определить, какой последовательный порт используется для подключения устройства, например, GSM-модема, в Unix-подобных операционных системах необходимо выполнить несколько шагов, учитывая, что последовательные порты не являются Plug and Play. Вот детальное руководство по выполнению этой задачи.

Шаг 1: Идентификация доступных последовательных портов

Сначала следует выяснить, какие последовательные порты уже доступны в системе. Для этого можно использовать команду dmesg, которая отображает сообщения ядра, включая информацию об инициализации портов.

Выполните следующую команду:

dmesg | grep ttyS

В выводе вы увидите список последовательных портов, например:

[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2
[    0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2

Это сообщение указывает, что порты ttyS0, ttyS1, ttyS4 и ttyS5 доступны на соответствующих адресах и прерываниях.

Шаг 2: Подключение устройства и проверка

Для определения, какой из этих портов связан с вашим устройством, вы должны наблюдать за изменениями в системе при подключении и отключении устройства. Это можно сделать с помощью анализа файла:

sudo cat /proc/tty/driver/serial > /tmp/1

Затем подключите устройство и снова выполните команду:

sudo cat /proc/tty/driver/serial > /tmp/2

Теперь сравните оба файла с помощью команды diff:

diff /tmp/1 /tmp/2

В выводе вы сможете увидеть изменения, которые произошли после подключения устройства. Например, если разница будет выглядеть следующим образом:

2c2
< 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0
---
> 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 CTS|DSR

Это говорит о том, что к порту ttyS0 было добавлено состояние линии CTS/DSR, что указывает на то, что именно этот порт связан с вашим устройством.

Шаг 3: Использование setserial для получения информации

Вы также можете использовать утилиту setserial для получения информации о последовательных портах. Установите ее, если она еще не установлена:

sudo apt update
sudo apt install setserial

Затем выполните следующие команды для отображения информации о доступных портах:

setserial -g /dev/ttyS* | sort -V

Или для USB-портов:

setserial -g /dev/ttyUSB* | sort -V

Шаг 4: Наблюдение за выводом dmesg

Эффективным способом мониторинга за устройствами в реальном времени является использование dmesg с опцией -w. Она позволяет наблюдать за выводом системы при подключении и отключении устройств:

dmesg -wH

После выполнения этой команды, подключите устройство, и в терминале появится информация о конфигурации новоы подключенного порта.

Заключение

Эти шаги помогут определить, какой именно последовательный порт используется для вашего устройства. Используя команды dmesg, cat, diff и setserial, вы получите полное представление о доступных портах и сможете правильно настроить взаимодействие с вашим устройством. Если вы ищете иные решения, рассмотрите использование дополнительных утилит, таких как serstatus или statserial, которые также могут помочь в получение информации о состоянии последовательных портов.

Оцените материал
Добавить комментарий

Капча загружается...