在Linux系统中,串口通信是一种常见的设备间数据交互方式,广泛应用于嵌入式开发、工业控制、传感器数据采集等领域,配置串口通信涉及硬件连接、驱动加载、参数设置、权限管理及软件测试等多个环节,以下将详细说明具体步骤和注意事项。
硬件连接与驱动检查
硬件连接
首先需要确保物理连接正确,Linux下的串口设备分为内置串口(通常为/dev/ttyS0
~/dev/ttyS3
,对应主板上的DB9接口)和USB转串口(通常为/dev/ttyUSB0
~/dev/ttyUSBX
,通过USB转串口芯片如PL2303、CH340等连接),连接时需注意:
- RS232串口:使用交叉连接(TX发送脚接RX接收脚,RX接收脚接TX发送脚),共地(GND脚相连)。
- RS485串口:需采用半双工通信模式,连接时注意A/B线对应,并在总线两端加终端电阻。
- USB转串口:直接插入USB接口,Linux通常会自动识别为串口设备。
驱动检查
硬件连接后,需确认驱动是否正常加载。
- 查看串口设备:使用
ls /dev/tty*
命令,若出现/dev/ttyS0
(内置)或/dev/ttyUSB0
(USB转串口),则表示设备已被识别。 - 检查驱动加载状态:通过
dmesg | grep tty
查看内核日志,若包含”ttyS0″或”ttyUSB0″相关信息,说明驱动已加载。 - USB转串口驱动问题:若未识别,可能是驱动缺失,以CH340芯片为例,可安装
linux-headers-$(uname -r)
(内核头文件)后,手动编译安装驱动(从官方下载驱动源码,执行make
和sudo make install
)。
串口参数配置
串口通信的核心是参数匹配,包括波特率、数据位、停止位、校验位和流控,这些参数需在收发两端保持一致,Linux下主要通过stty
命令配置。
核心参数说明
参数类型 | 可选值及说明 | 示例(stty 命令参数) |
---|---|---|
波特率 | 300、600、1200、2400、4800、9600、19200、38400、57600、115200等 | 9600 (设置波特率为9600) |
数据位 | 5、6、7、8(默认8位,即1字节) | cs8 (8位数据位) |
停止位 | 1、2(默认1位) | -cstopb (1位停止位) |
校验位 | 无校验(-parenb )、偶校验(parenb parodd )、奇校验(parenb -parodd ) |
-parenb (无校验) |
流控 | 无流控(-ixon )、硬件流控(rtscts )、软件流控(ixon -ixoff ) |
-ixon (无软件流控) |
配置命令示例
假设配置/dev/ttyS0
,参数为:波特率115200、8位数据位、1位停止位、无校验、无流控,执行:
sudo stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb -ixon
-F
:指定设备文件路径;- 配置后可通过
stty -F /dev/ttyS0
查看当前参数,确认是否生效。
权限管理
Linux中,串口设备默认只有root用户或dialout
组成员可读写,普通用户使用时需将其加入dialout
组:
sudo usermod -a -G dialout $USER # 将当前用户加入dialout组
执行后需重新登录使权限生效,若临时使用,也可通过sudo chmod 666 /dev/ttyS0
开放所有用户权限(不推荐,存在安全风险)。
软件通信测试
配置完成后,需通过软件测试收发功能。
发送测试
使用echo
或printf
向串口发送数据:
echo "hello" > /dev/ttyS0 # 发送字符串(默认无换行符) printf "hellon" > /dev/ttyS0 # 发送字符串并带换行符
若另一端设备能正常接收,说明发送正常。
接收测试
使用cat
或重定向方式读取串口数据:
cat /dev/ttyS0 # 实时读取串口数据(阻塞式,按Ctrl+C退出) cat /dev/ttyS0 > log.txt & # 后台读取并保存到文件(&表示后台运行)
若另一端发送数据后,本地能正常接收并显示,说明接收正常。
专业工具测试
- minicom:一款常用的串口调试工具,安装:
sudo apt install minicom
配置:minicom -s
→ 选择”Serial port setup” → 设置串口设备(/dev/ttyS0
)、波特率等参数 → 保存退出(Save setup as dfl)。
使用:启动minicom
,输入数据后按回车发送,接收数据会直接显示;退出按Ctrl+A
,再按Q
。 - screen:轻量级终端工具,安装:
sudo apt install screen
使用:screen /dev/ttyS0 115200
,操作与终端一致;退出按Ctrl+A
,再按K
。
调试技巧
若通信异常,可按以下步骤排查:
- 参数匹配:确认收发两端波特率、数据位、停止位、校验位一致。
- 设备占用:使用
lsof /dev/ttyS0
检查是否有其他程序占用串口,若有需先关闭占用程序。 - 驱动状态:通过
dmesg | grep tty
查看驱动加载错误,或setserial -g /dev/ttyS0
检查串口资源(如IRQ、I/O地址)。 - 线缆及硬件:检查串口线是否损坏、接触不良,或更换USB转串口芯片测试。
相关问答FAQs
问题1:串口通信时接收到的数据乱码,如何排查?
解答:首先检查收发两端串口参数(波特率、数据位、停止位、校验位)是否完全一致,这是最常见的乱码原因;其次确认线缆连接是否正确(TX-RX交叉,共地);然后检查串口是否被其他程序占用(lsof /dev/ttyS0
);最后查看驱动是否正常(dmesg | grep tty
),若驱动报错需重新安装驱动。
问题2:如何让串口通信在后台持续运行,避免终端关闭后程序终止?
解答:可通过以下方式实现后台持续运行:
- 使用
nohup
:nohup cat /dev/ttyS0 > serial_log.txt &
,即使终端关闭,数据仍会持续写入serial_log.txt
,&
表示后台运行。 - 使用
screen
:启动screen /dev/ttyS0 9600
后,按Ctrl+A
+D
分离会话,终端关闭后程序仍运行;需恢复时执行screen -r
。 - 编写脚本:使用
while
循环持续读取串口,while true; do read -r line < /dev/ttyS0; echo "$line" >> log.txt; done &
,后台运行并保存数据。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/38152.html