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

Hi-*_*gel 42 tty devices serial-port

问题:

我通过串行端口(又名 RS-232)插入设备(即 GSM 调制解调器),我需要查看/dev/该设备与文件系统中的哪个文件绑定,以便能够与其进行通信。不幸的是/dev/dmesg输出中没有新创建的文件,也看不到任何内容。所以这似乎是一个很难回答的问题。

背景:

我从来没有使用过串口设备,所以昨天,当出现需要时,我尝试谷歌它但找不到任何有用的东西。我花了几个小时寻找,我想分享一个找到的答案,因为它可能对某人有所帮助。

Hi-*_*gel 39

不幸的是,串行端口不是即插即用的,因此内核不知道插入了哪个设备。阅读HowTo教程后,我有了工作的想法。

/dev/unix like OSes的目录包含名为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
Run Code Online (Sandbox Code Playgroud)

以上是我的 PC 的示例输出。可以看到几个串口的初始化:

ttyS0, ttyS1, ttyS4, ttyS5.

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

$ sudo cat /proc/tty/driver/serial> /tmp/1
Run Code Online (Sandbox Code Playgroud)

(un) 插入设备

$ sudo cat /proc/tty/driver/serial> /tmp/2
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

通过将这三个数字与 dmesg 输出进行比较,我们可以确定哪个是端口:

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

因此,我们的设备是/dev/ttyS0,任务完成!

  • 如果我在 dmesg 输出中没有看到任何设备怎么办? (2认同)
  • @user3019105 抱歉,我从来没有遇到过这样的问题。据我了解,`dmesg` 应该有一条关于将 *irq* 分配给串行设备的消息。如果没有,我会假设一些硬件问题。这只是一个假设,可能是错误的,但如果我要调试这样的问题,我会以串行端口应该已经初始化的想法开始研究。 (2认同)