Python 中 pySerial 库的核心用法与实操示例

Evan
Evan
发布时间:2026-10-11 | 3人浏览过
原创

pySerial 是 Python 处理串口通信的标准第三方库。本文系统梳理该库在嵌入式设备对接、硬件控制与仪器数据采集中的典型应用,给出从环境安装、端口参数配置到数据读写、缓冲区监控及安全释放的完整操作示例,帮助开发者快速建立稳定的串行通信链路。

pySerial 核心应用场景

pySerial(导入时常写作 serial)专为解决 Python 程序与外部物理接口或虚拟端口的数据交换而设计。在实际工程中,它主要支撑以下四类需求:

  • 嵌入式系统互联:兼容 Arduino、Raspberry Pi 等微控制器平台,用于板级日志回传与固件交互。
  • 工业外设与控制模块:向机器人底盘、GPS 定位模组、PLC 网关发送指令字或接收反馈报文。
  • 科学仪器数据抓包:对接光谱仪、示波器、万用表等设备,通过固定协议抓取测量原始数据。
  • 纯软件仿真测试:借助配对工具创建本地虚拟 COM 口对,在不插拔实体硬件的情况下验证收发逻辑。

基础环境准备

在使用前需确保操作系统已正确识别目标串口号(Windows 通常为 COMx,Linux/macOS 多为 /dev/ttyUSBx 或 /dev/cu.usbserial*)。通过包管理器完成依赖安装:

pip install pyserial

安装完毕后,在 Python 脚本顶层引入主模块:import serial。

第1步:实例化并配置串口参数

所有收发操作均基于 serial.Serial 对象展开。构造时需明确指定物理端口标识,并匹配硬件约定的通信速率与校验格式。若仅传入端口名,其他参数将沿用出厂默认值。

import serial

# 方式A:一次性传入关键参数
ser = serial.Serial('/dev/ttyUSB0', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1)

# 方式B:先实例化后动态赋值
ser = serial.Serial()
ser.port = '/dev/ttyUSB0'
ser.baudrate = 9600
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.timeout = 1

完成状态判断:执行上述代码后,串口句柄已建立,但物理线路尚未激活,调用 ser.is_open 将返回 False。

第2步:执行数据读写流程

串口属于面向字节流的数据通道,Python 3 中必须使用字节字符串(b'')进行收发。主动开启连接后,即可按业务逻辑推送或拉取报文。

# 激活端口链路
ser.open()
print(f'端口状态:{ser.is_open}')

# 发送数据
command = b'CMD_GET_DATA\r\n'
sent_count = ser.write(command)
print(f'成功下发 {sent_count} 字节')

# 按固定长度读取原始字节
raw_data = ser.read(10)
print(f'收到原始帧:{raw_data.hex()}')

# 按行读取(默认以换行符 \n 结束)
one_line = ser.readline()
all_lines = ser.readlines()

第3步:缓冲区管理与端口安全释放

持续通信时,底层缓存极易积压旧数据导致解析错位。需在关键节点清理缓冲并核对队列水位,最后务必显式关闭句柄以防占用系统资源。

# 检查输入/输出队列堆积量
rx_waiting = ser.in_waiting  # 当前可读字节数
tx_waiting = ser.out_waiting # 待发送字节数

# 清空输出侧残留数据
ser.flushOutput()

# 强制丢弃输入缓存中的一切未读内容
ser.flushInput()

# 切断物理连接并重置对象状态
ser.close()

常见排错与维护建议

在实际联调阶段,开发者常遇到以下瓶颈,可按顺序排查:

  1. 权限拒绝(Permission denied):Linux/macOS 环境下普通用户无权直连硬件节点。需将运行账户加入 dialout / tty 用户组,或使用管理员权限执行终端命令。
  2. 进程卡死无响应:read() 在未设定 timeout 时会无限期挂起。务必配置合理的等待秒数(如 timeout=2),或使用非阻塞模式结合轮询检测 in_waiting。
  3. 乱码与中文解析失败:底层传输严格区分编码格式。若设备端输出的是文本字符,建议在读取完成后追加解码步骤:text = ser.read().decode('utf-8')。
  4. 波特率失配:主机设定的 baudrate 必须与硬件说明书完全一致,否则会出现大量位翻转噪点。可通过系统自带的串口调试助手交叉验证信号质量。

总结

掌握 pySerial 的参数映射规律与生命周期管理,是打通 Python 上位机与底层传感网络的基石。合理配置超时阈值、做好缓冲区防溢处理,能够显著提升工程现场的通讯稳定性。

以上就是 Python 中使用 pySerial 库进行串口通信的详细内容,更多关于 Python 硬件通信与物联网项目实战的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表