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

33

Вопрос:

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

Задний план:

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

Привет, ангел
источник
1
Мне нравится использовать эти биты для обнаружения устройства - вероятно, я буду использовать это, хотя у меня есть много устройств, которые используют только выводы Tx / Rx, я мог бы, вероятно, взломать их, чтобы удерживать линию CTS на высоком уровне.
Дэнни Стейпл
1
Связанный stackoverflow.com/questions/2530096/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

34

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

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

$ 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, миссия выполнена!

Привет, ангел
источник
1
Что если я не вижу никакого устройства в выводе dmesg?
user3019105
2
@ user3019105 извините, я никогда не сталкивался с такой проблемой. Из того, что я понимаю, dmesgдолжно появиться сообщение о назначении irq последовательному устройству. И если этого не произойдет, я бы предположил некоторые аппаратные проблемы. Это всего лишь предположение, и оно может быть ошибочным, но если бы я отладил такую ​​проблему, я бы начал исследования с мыслью, что последовательный порт должен быть инициализирован.
Привет, Ангел,
1
Так как я перехожу с машины на машину, я определил псевдоним, чтобы показать мне последовательные порты на этой машине. Он работает в системах семейства Ubuntu с systemd. alias ports = 'udevadm info --export-db | grep -i "^ n: ttyu"'
DDay