问题:
我通过串行端口(又名 RS-232)插入设备(即 GSM 调制解调器),我需要查看/dev/
该设备与文件系统中的哪个文件绑定,以便能够与其通信。不幸的是,没有新创建的文件,/dev/
也看不到dmesg
输出中的任何内容。所以这似乎是一个很难的问题。
背景:
我从未使用过串行设备,所以昨天,当出现需要时,我尝试用谷歌搜索,但找不到任何有用的东西。我花了几个小时寻找,我想分享找到的答案,因为它可能对某人有帮助。
答案1
不幸的是,串行端口是非PlugNPlay,因此内核不知道插入了哪个设备。在读取如何教程我已经有了工作的想法。
类似 UNIX 的操作系统的目录/dev/
包含名为蒂斯 (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
因此,通过比较插入设备和未插入设备时的文件内容,我们可以轻松找到终端与我们的设备相关。所以,现在做:
$ 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
任务完成了!
答案2
setserial
除了 之外,您还可以用于获取和设置串行端口信息dmesg
。
在 Ubuntu 18.04 上测试:
setserial
# install it
sudo apt update
sudo apt install setserial
# Display (and sort) serial information for all /dev/ttyS* devices
setserial -g /dev/ttyS* | sort -V
# Display (and sort) serial information for all /dev/ttyUSB* devices
setserial -g /dev/ttyUSB* | sort -V
# To see extra info. such as the baud rate too, add `-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
还可以查看其中一些信息:
# Show UART information, incl. baudrate, for /dev/ttyS* devices.
dmesg | grep ttyS
# Show UART information, incl. baudrate, for /dev/ttyUSB* devices.
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
,居住。