PySerial库简明使用指南:串口通信快速入门
概述
PySerial是Python中用于串口通信的标准库,它提供了跨平台的串口操作接口。本文将介绍PySerial的基本使用方法,包括串口配置、数据读写等核心功能。
串口打开与基础配置
基本串口打开方式
最简单的串口打开方式只需指定端口名称:
import serial
ser = serial.Serial('/dev/ttyUSB0') # 打开串口
print(ser.name) # 查看实际使用的端口
ser.write(b'hello') # 写入数据
ser.close() # 关闭端口
这种方式会使用默认参数:9600波特率、8数据位、无校验位、1停止位、无超时设置。
带参数的串口配置
更常见的做法是在打开时指定通信参数:
with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
x = ser.read() # 读取一个字节
s = ser.read(10) # 最多读取10个字节(受超时限制)
line = ser.readline() # 读取一行(以\n结尾)
使用with
语句可以确保串口在使用后自动关闭。
高级配置示例
ser = serial.Serial('COM3', 38400, timeout=0,
parity=serial.PARITY_EVEN, rtscts=1)
s = ser.read(100) # 读取最多100个字节或缓冲区中所有可用数据
这个例子展示了如何配置偶校验和硬件流控制(RTS/CTS)。
串口的延迟配置
PySerial允许先创建Serial实例,稍后再配置和打开:
ser = serial.Serial()
ser.baudrate = 19200
ser.port = 'COM1'
ser.open() # 显式打开端口
print(ser.is_open) # 检查端口是否打开
ser.close()
同样支持with
语句:
with serial.Serial() as ser:
ser.baudrate = 19200
ser.port = 'COM1'
ser.open()
ser.write(b'hello')
数据读取方法详解
readline()方法
readline()
会读取直到遇到换行符\n
为止,包含换行符本身:
line = ser.readline() # 读取一行
重要注意事项:
- 必须设置超时(timeout),否则在没有收到换行符时会永久阻塞
- 如果返回值缺少
\n
,说明是在超时后返回的
readlines()方法
readlines()
尝试读取"所有"行,对于仍然打开的串口来说,这个定义不明确。因此:
- 依赖端口超时设置,将超时解释为EOF(文件结束)
- 如果端口未正确打开会引发异常
- 返回的行列表不包含
\n
超时机制
这两个方法都调用read()
获取数据,串口超时设置作用于这个底层方法。因此readlines()
的有效超时可能比预期长很多。
行结束符(EOL)处理
对于需要指定行结束符或使用通用换行模式的情况,建议使用io.TextIOWrapper
:
import serial
import io
ser = serial.serial_for_url('loop://', timeout=1)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
sio.write("hello\n")
sio.flush() # 必须刷新缓冲区
hello = sio.readline()
print(hello == "hello\n")
这种方法提供了更灵活的文本处理能力。
串口测试工具
列出可用串口
PySerial提供了列出可用串口的工具:
python -m serial.tools.list_ports
可以添加正则表达式作为参数来过滤结果:
python -m serial.tools.list_ports "COM[0-9]+"
注意:枚举功能可能因操作系统而异,可能不完整或包含不可用端口。
迷你终端工具
PySerial包含一个基于控制台的简单终端程序miniterm,可以这样启动:
python -m serial.tools.miniterm <port_name>
使用-h
选项查看所有可用参数。
最佳实践建议
- 始终设置合理的超时值,避免程序阻塞
- 优先使用
with
语句管理串口资源 - 对于文本协议,考虑使用
TextIOWrapper
进行包装 - 在生产环境中使用前,先用测试工具验证串口配置
- 注意不同操作系统下串口命名的差异
通过本文介绍的基础知识,您应该已经能够使用PySerial进行基本的串口通信操作。对于更高级的应用,可以参考库中的示例代码进一步学习。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考