在Linux系统中,串口(Serial Port)是常用的设备通信接口,广泛应用于嵌入式开发、工业控制、设备调试等场景,要确保串口通信正常,首先需要掌握如何查看串口的状态,包括串口是否存在、是否被占用、硬件配置参数、当前通信设置等信息,本文将详细介绍Linux系统中查看串口状态的多种方法及实用技巧。
通过设备文件查看串口是否存在
Linux系统中的串口设备以文件形式存储在/dev
目录下,常见的串口设备文件命名规则如下:
- 内置串口:通常命名为
/dev/ttyS0
、/dev/ttyS1
等,对应主板上的物理串口(COM1、COM2等)。 - USB转串口:插入USB转串口适配器后,系统会识别为
/dev/ttyUSB0
、/dev/ttyUSB1
等(具体编号取决于插入顺序)。 - 蓝牙串口:通过蓝牙设备模拟的串口通常命名为
/dev/ttyACM0
、/dev/ttyACM1
等。
操作步骤:
使用ls
命令列出/dev
目录下的串口设备文件:
ls /dev/ttyS* /dev/ttyUSB* /dev/ttyACM*
若输出类似/dev/ttyS0 /dev/ttyUSB0
的结果,说明系统已识别到对应的串口设备。
常见串口设备文件命名及说明
设备类型 | 命名示例 | 适用场景 |
---|---|---|
内置串口 | /dev/ttyS0 |
主板原生串口(如COM1) |
USB转串口 | /dev/ttyUSB0 |
USB转RS232/RS485适配器 |
蓝牙串口 | /dev/ttyACM0 |
蓝牙模块模拟的串口设备 |
PCI串口卡 | /dev/ttyPCI0 |
扩展PCI串口卡 |
通过内核日志查看串口识别状态
当串口设备(尤其是USB转串口)插入时,内核会输出识别日志,可通过dmesg
命令查看。
操作步骤:
- 插入串口设备(如USB转串口适配器)。
- 执行以下命令过滤与串口相关的内核日志:
dmesg | grep -i "tty|serial|usb"
- 关键输出示例:
- USB转串口识别:
[ 1234.567890] usb 1-1: new full-speed USB device number 2 using ehci-pci
- 驱动加载:
[ 1234.678901] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
- 内置串口信息:
[ 1234.789012] serial 00:00: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
- USB转串口识别:
通过日志可确认设备是否被内核正确识别,若未识别,可能是驱动未加载(需安装usbserial
、cp210x
等驱动)。
使用setserial
命令查看串口硬件配置
setserial
是Linux下查看和配置串口硬件参数的工具,可显示串口的UART类型、端口地址、中断号(IRQ)等底层信息。
操作步骤:
查看指定串口的硬件配置(如/dev/ttyS0
):
setserial -g /dev/ttyS0
输出示例:/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
参数说明:
- UART:串口控制器类型(如16550A支持硬件流控);
- Port:串口占用的I/O地址(如0x03f8对应COM1);
- IRQ:中断请求号(如4对应COM1的中断线)。
若需查看所有串口硬件信息,可使用:
setserial -g /dev/ttyS[0-3] /dev/ttyUSB[0-3]
使用stty
命令查看串口当前通信参数
stty
命令用于查看或配置串口的当前通信参数(如波特率、数据位、停止位、校验位等),这些参数直接影响串口通信的兼容性。
操作步骤:
查看/dev/ttyUSB0
的当前配置:
stty -F /dev/ttyUSB0
输出示例:
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
关键参数解读:
- speed:波特率(如9600、115200);
- cs8:数据位为8位;
- -cstopb:停止位为1位(
cstopb
表示2位停止位); - -parenb:无校验位(
parenb
表示启用校验位,parodd
表示奇校验)。
若需修改参数(如设置波特率为115200),可通过stty -F /dev/ttyUSB0 115200
命令实现。
检查串口占用状态
串口被其他进程占用时,无法正常通信,需通过lsof
或fuser
命令查看占用进程。
方法1:使用lsof
(List Open Files)
lsof /dev/ttyS0
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
minicom 1234 root 3u CHR 64,64 0t0 1234 /dev/ttyS0
若输出为空,说明串口未被占用;否则会显示占用进程的名称、PID等信息。
方法2:使用fuser
fuser -v /dev/ttyUSB0
输出示例:
USER PID ACCESS COMMAND
/dev/ttyUSB0: root 1234 F.... minicom
参数-v
显示详细信息,ACCESS
列中的F
表示文件已打开。
强制结束占用进程(谨慎操作)
若需释放串口,可通过kill
命令终止占用进程:
kill -9 1234 # 1234为占用进程的PID
通过串口工具测试通信状态
使用minicom
、screen
或picocom
等串口终端工具,可直接测试串口是否可正常收发数据。
示例:使用screen
测试/dev/ttyUSB0
- 启动
screen
(波特率9600,8数据位,无校验,1停止位):screen /dev/ttyUSB0 9600
- 在终端中输入任意字符,若另一端设备能正常接收,说明串口通信正常;
- 退出
screen
:按Ctrl+A
,再按K
,输入y
确认。
权限问题排查
串口设备通常需要特定权限才能访问,普通用户可能因权限不足导致无法打开串口。
检查权限
ls -l /dev/ttyS0
输出示例:crw-rw---- 1 root dialout 4, 64 May 10 10:00 /dev/ttyS0
crw-rw----
表示设备文件权限为:所有者(root)可读写,组用户(dialout)可读写,其他用户无权限;dialout
为串口设备的默认用户组。
赋予当前用户权限
- 将用户加入
dialout
组:sudo usermod -aG dialout $USER
- 重新登录或执行
newgrp dialout
使权限生效; - 或临时通过
sudo
获取权限:sudo screen /dev/ttyUSB0 9600
相关问答FAQs
Q1:为什么我无法打开串口设备,提示“权限被拒绝”?
A:这是因为当前用户没有串口设备的读写权限,Linux中串口设备通常属于root
用户和dialout
组,普通用户需要加入dialout
组才能访问,可通过以下步骤解决:
- 执行
sudo usermod -aG dialout $USER
将用户加入dialout
组; - 重新登录系统或执行
newgrp dialout
; - 若仍无法访问,可临时使用
sudo
命令(如sudo minicom
),或修改设备权限(sudo chmod 666 /dev/ttyUSB0
,但此方法不安全,不推荐长期使用)。
Q2:串口设备被占用,如何找到并结束占用进程?
A:可通过lsof
或fuser
命令定位占用进程,然后使用kill
命令终止,具体步骤如下:
- 使用
lsof /dev/ttyS0
查看占用进程(如显示minicom 1234 root 3u CHR 64,64 0t0 /dev/ttyS0
); - 记录进程的PID(如1234);
- 使用
kill -9 1234
强制终止进程(-9
为强制终止信号); - 再次检查串口是否被释放(执行
lsof /dev/ttyS0
,若输出为空则释放成功)。
注意:强制终止进程可能导致未保存的数据丢失,建议先尝试kill 1234
(正常终止),无效后再使用kill -9
。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32316.html