如何找到正在使用的串行端口?


33

问题:

我通过串行端口(也称为RS-232)插入了设备(即GSM调制解调器),并且需要查看/dev/该设备与文件系统中的哪个文件捆绑在一起,才能与其通信。不幸的是,没有新创建的文件,/dev/dmesg输出中也看不到任何东西。因此,这似乎是一个难题。

背景:

我从未使用过串行设备,所以昨天,当有需要时,我尝试使用Google进行搜索,但找不到任何有用的东西。我花了几个小时进行搜索,我想分享找到的答案,因为这可能对某人有所帮助。


1
我喜欢使用这些位来检测设备-尽管我有很多设备仅使用Tx / Rx引脚,但我可能会用它,但我可能会破解它们以将CTS线保持在高电平。
Danny Staple 2014年

Answers:


34

不幸的是,串行端口不是Plug-NPlay,因此内核不知道插入了哪个设备。阅读了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

上面是我的PC的示例输出。您可以看到一些串行端口的初始化:

ttyS0ttyS1ttyS4ttyS5

其中之一在插入设备时具有正电压。因此,通过比较文件内容(/proc/tty/driver/serial插入和不插入设备时),我们可以轻松找到与我们的设备相关的ttyS。所以,现在做:

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

(取消)插入设备

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

接下来检查两个文件之间的差异。以下是我的PC的输出:

$ 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 2013年

2
@ user3019105对不起,我从未遇到过此类问题。据我了解,dmesg应该有一条有关将irq分配给串行设备的消息。如果没有,我会假设一些硬件问题。那只是一个假设,可能是错误的,但是如果我调试了这样一个问题,我会考虑到应该初始化串行端口的想法来开始研究。
Hi-Angel

1
由于我从一台机器移到另一台机器,因此我已经定义了一个别名,以向我显示该机器上的串行端口。它适用于具有systemd的Ubuntu系列系统。alias ports ='udevadm info --export-db | grep -i“ ^ n:ttyu”“
DDay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.