在 Linux 系统下使用 Python 进行串口通信,最常用且推荐的库是 pyserial。
以下是完整的指南,包括安装、权限设置、代码示例和常见问题排查。
安装 pyserial
在终端中运行以下命令安装库:
pip install pyserial
获取串口设备名称
在 Linux 中,串口设备通常位于 /dev/ 目录下。
- USB 转串口(如 CH340, CP2102, FTDI):通常是
/dev/ttyUSB0,/dev/ttyUSB1等。 - 蓝牙串口:通常是
/dev/rfcomm0。 - 原生串口(树莓派等):通常是
/dev/ttyAMA0或/dev/ttyS0。
查看当前连接的串口设备:
ls -l /dev/ttyUSB # 或者 dmesg | grep tty
基本代码示例
发送数据
import serial
import time
# 配置串口参数
# port: 串口名称,如 '/dev/ttyUSB0'
# baudrate: 波特率,需与设备一致,如 9600, 115200
# timeout: 读取超时时间(秒),None 表示阻塞,0 表示非阻塞
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
parity=serial.PARI
TY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
print(f"串口 {ser.name} 已打开")
try:
# 发送数据(注意:必须发送 bytes 类型)
ser.write(b'Hello, Serial!n')
print("数据已发送")
# 读取响应
response = ser.readline() # 读取一行,包含换行符
if response:
print(f"收到响应: {response.decode('utf-8').strip()}")
except Exception as e:
print(f"发生错误: {e}")
finally:
# 关闭串口
ser.close()
print("串口已关闭")
持续读取数据(接收模式)
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
try:
while True:
if ser.in_waiting > 0: # 检查是否有数据可读
line = ser.readline().decode('utf-8').strip()
print(f"收到: {line}")
time.sleep(0.1) # 避免 CPU 占用过高
except KeyboardInterrupt:
print("n程序退出")
finally:
ser.close()
常见问题与解决方案
❌ 问题 1:Permission denied(权限被拒绝)
原因:普通用户没有 /dev/ttyUSB0 的读写权限。
解决方案:
-
临时解决
(每次重启失效):
sudo chmod 666 /dev/ttyUSB0
-
永久解决(推荐):
将当前用户加入dialout组(Ubuntu/Debian)或tty组(部分发行版):sudo usermod -a -G dialout $USER
⚠️ 重要:执行后需要注销并重新登录,或重启系统才能生效。
-
验证用户组:
groups $USER
❌ 问题 2:SerialException: [Errno 5] Input/output error
原因:
- 串口被其他程序占用(如 Minicom、PuTTY、Arduino IDE 串口监视器)。
- 设备未正确连接或驱动问题。
解决方案:
- 关闭所有可能占用串口的程序。
- 检查物理连接。
- 尝试重新插拔 USB 设备。
❌ 问题 3:发送/接收乱码
原因:波特率、数据位、停止位、校验位不匹配。
解决方案:
- 确保
baudrate与设备完全一致。 - 检查
parity,stopbits,bytesize设置。 - 确认发送的是
类型(使用bytes
b'...'或.encode())。
高级技巧
使用上下文管理器(推荐)
使用 with 语句可以自动关闭串口,更安全:
import serial
with serial.Serial('/dev/ttyUSB0', 9600, timeout=1) as ser:
ser.write(b'Testn')
response = ser.readline()
print(response)
# 离开 with 块时,串口会自动关闭
获取可用串口列表
import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
for port in ports:
print(f"{port.device}: {port.description}")
| 步骤 | 操作 |
|---|---|
| 1 | 安装 pyserial:pip install pyserial |
| 2 | 确认串口设备名:ls /dev/ttyUSB |
| 3 | 添加用户到 dialout 组:sudo usermod -a -G dialout $USER |
| 4 | 重启或重新登录 |
| 5 | 编写 Python 代码,注意发送 bytes 类型数据 |
如有具体问题(如特定硬件型号、错误日志),欢迎提供更多信息!
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/487138.html



