Python串口通信发送与接收实现及pyserial配置指南
Python通过第三方库pyserial可快速实现与外部设备的串口通信。本文详解如何安装依赖、配置波特率等参数、执行数据发送与接收,并提供完整代码与常见报错排查方法,助力开发者稳定完成硬件联调。
串口通信基础与依赖环境
串口通信采用逐字节传输方式,需要预留响应时间进行握手与校验,适用于传感器、调制解调器等外设的数据交换。需注意,Python标准库中并不包含该模块,官方通用方案为安装第三方依赖 pyserial。在终端执行以下命令完成环境准备:
pip install pyserial
第1步:建立串口连接并配置参数
目的:初始化通信通道,确保主机与外设的物理链路及协议层参数一致。
入口:Python脚本首行导入模块
动作与参数:调用 serial.Serial() 实例化对象。关键字段说明如下:
- port:串口号(Linux/Mac 通常为 /dev/ttyUSB0 或 /dev/cu.usbserial-*;Windows 通常为 COM3)
- baudrate:波特率,如 9600,需与设备端严格匹配
- bytesize:数据位,常用 8 位
- parity:奇偶校验,'N' 表示无校验
- stopbits:停止位,通常设为 1
- timeout:读取超时秒数,设为 1 可防止程序陷入永久阻塞
import serial
ser = serial.Serial(
port='COM3', # 请替换为实际端口号
baudrate=9600,
bytesize=8,
parity='N',
stopbits=1,
timeout=1
)
第2步:构造并发送二进制指令
目的:将业务指令转换为硬件可读的二进制流并推送到缓冲区。
入口:已打开的串口对象
动作:调用 ser.write() 方法。该方法仅接受 bytes 类型,若为普通字符串需显式编码(默认 UTF-8 或 ASCII)。
# 示例:发送十六进制指令与纯文本指令
ser.write(bytes([0x55, 0xAA, 0x01]))
ser.write(b'CMD_START\r\n')
第3步:按约定读取并解析回传数据
目的:同步获取设备反馈,验证通信状态。
入口:发送操作完成后立即执行
动作:调用 ser.read(n) 指定抓取字节数。若需等待特定结束符(如换行或十六进制帧尾),可改用 ser.readline() 配合条件循环判断,避免截断半包数据。
# 读取指定长度或等待超时返回
raw_data = ser.read(10)
print(f'Received: {raw_data}')
# 安全关闭连接,释放系统句柄
ser.close()
完整收发流程示例
将上述逻辑整合为结构化脚本,加入异常捕获以保证资源回收。实际调试时建议先用串口助手测试通断,再切入代码验证。
import serial
try:
# 1. 初始化
ser = serial.Serial('COM3', 9600, timeout=1)
print('串口已打开')
# 2. 发送
ser.write(b'TEST_DATA\n')
# 3. 接收
response = ser.read(20)
print('回传结果:', response)
except serial.SerialException as e:
print('通信异常:', e)
finally:
# 4. 清理
if 'ser' in locals() and ser.is_open:
ser.close()
print('串口已关闭')
常见问题与排错指引
- 端口被占用或无权限访问:Windows 下检查是否已被其他串口软件独占;Linux/Mac 需确认当前用户具备 tty 权限(可尝试
sudo chmod a+rw /dev/ttyUSB0)。 - 打印乱码或报 UnicodeDecodeError:双方波特率、数据位或校验位不一致导致比特错位;或接收端未正确解码,建议使用
response.decode('utf-8', errors='ignore')兼容处理。 - read() 函数卡死无响应:未正确设置
timeout或未检测到有效数据包。建议启用日志打印中间态,或改用线程轮询配合ser.in_waiting属性预判数据就绪情况。
以上就是基于Python实现串口数据收发与解析的详细操作指南,更多关于软硬件交互与物联网开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









