news 2026/9/3 5:38:29

Python PySerial 库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python PySerial 库

PySerial 是 Python 中用于串口(UART)通信的跨平台第三方库,支持 Windows、Linux、macOS 等多种操作系统,提供了简洁、一致的 API 用于串口设备的读写和控制。

1. 安装 PySerial

在开始使用前,需要通过 pip 安装该库。

pip install pyserial

安装完成后,可以在 Python 脚本中验证是否成功:

import serial print("pyserial version:", serial.__version__)

2. 基本使用流程

使用 PySerial 进行串口通信通常遵循以下步骤:导入库 -> 配置并打开串口 -> 读写数据 -> 关闭串口

2.1 导入库并打开串口

首先导入serial模块,然后创建Serial对象来初始化并打开串口。

import serial # 初始化串口连接,参数可在此处设置 ser = serial.Serial( port='COM3', # Windows 端口名,如 COM1;Linux/macOS 为 /dev/ttyUSB0 等[1](@ref)[6](@ref) baudrate=9600, # 波特率,常见值有 9600, 115200 等[5](@ref) bytesize=serial.EIGHTBITS, # 数据位,8位 parity=serial.PARITY_NONE, # 校验位,无校验 stopbits=serial.STOPBITS_ONE, # 停止位,1位 timeout=1 # 读超时时间(秒),None为无限等待,0为非阻塞[1](@ref) )

创建Serial对象时,若指定了port,串口通常会立即打开。你也可以先创建对象,后续再配置参数并手动打开:

ser = serial.Serial() ser.port = 'COM3' ser.baudrate = 115200 ser.open()
2.2 检查串口状态

可以使用is_open属性检查串口是否成功打开。

if ser.is_open: print(f"串口 {ser.port} 已打开") else: print("串口打开失败")
2.3 读写数据
  • 写入数据:使用write()方法,参数必须是字节类型(bytes)。
    # 发送字符串(需编码为字节) ser.write("Hello, Serial!".encode('utf-8')) # 或直接发送字节数据 ser.write(b'\x01\x02\x03')
  • 读取数据:有多种读取方法。
    • read(size=1):读取指定大小的字节数。
    • readline():读取一行,以换行符\n结束。
    • read_all():读取接收缓冲区中的所有数据。
    data = ser.read(10) # 读取最多10个字节 line = ser.readline() # 读取一行 print(line.decode('utf-8')) # 将字节数据解码为字符串
    在读取前,可用in_waiting属性检查接收缓冲区中的字节数。
    if ser.in_waiting: data = ser.read(ser.in_waiting)
2.4 关闭串口

通信完成后,应关闭串口以释放资源。

ser.close()

为了确保串口被正确关闭,推荐使用with语句(上下文管理器),它会在代码块执行完毕后自动关闭串口。

with serial.Serial('COM3', 9600, timeout=1) as ser: ser.write(b'Hello') data = ser.readline()

3. 常用方法与属性

除了基本的读写,PySerial 还提供了其他有用的方法和属性:

  • flushInput():清空输入缓冲区,丢弃所有待读取数据。
  • flushOutput():清空输出缓冲区,终止当前写操作。
  • flush():等待所有数据写出。
  • 串口参数获取与设置:创建对象后,仍可动态修改部分属性,如ser.baudrate = 115200
  • 获取端口列表:可以使用serial.tools.list_ports来列出当前可用的串口。
    import serial.tools.list_ports ports = serial.tools.list_ports.comports() for port in ports: print(port.device)

4. 实际应用示例

以下是一个完整的简单示例,实现了打开串口、发送指令并读取回复的功能:

import serial import time def main(): # 1. 配置并打开串口 ser = serial.Serial( port='COM3', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=2 # 设置读超时为2秒 ) try: if not ser.is_open: ser.open() # 2. 发送数据 command = b'READ_DATA\r\n' # 示例指令,通常需要根据设备协议定义 ser.write(command) print(f"Sent: {command}") # 3. 等待并读取回复 time.sleep(0.1) # 根据设备响应时间适当等待 if ser.in_waiting: response = ser.readline() print(f"Received: {response.decode('utf-8').strip()}") except serial.SerialException as e: print(f"串口通信错误: {e}") except Exception as e: print(f"发生错误: {e}") finally: # 4. 确保关闭串口 if ser and ser.is_open: ser.close() print("串口已关闭") if __name__ == '__main__': main()

5. 常见问题与注意事项

  1. 串口无法打开:可能原因是端口号错误、端口被其他程序占用,或在 Linux/macOS 上权限不足。请检查端口名并使用serial.tools.list_ports.comports()确认可用端口。
  2. 数据读写异常或无数据
    • 确保通信双方的波特率、数据位、停止位、校验位等参数完全一致。
    • 检查物理连接(如 USB 转串口线)是否正常。
    • 适当调整timeout参数,避免因设备响应慢导致读超时。
  3. 数据格式处理:串口传输的是原始字节流。发送字符串前需用.encode()编码,接收后需用.decode()解码。务必确认设备使用的字符编码(通常为 UTF-8 或 ASCII)。
  4. 跨平台兼容性:PySerial 是跨平台的,但端口名称因系统而异:Windows 为COMx,Linux 通常为/dev/ttyUSBx/dev/ttySx,macOS 为/dev/tty.usbserialxxx

总结

PySerial 库功能全面且易于上手,是 Python 进行串口通信的首选工具。核心步骤是正确配置参数、打开端口、进行字节级的读写操作,并在完成后关闭端口。对于更复杂的应用,如多线程通信或遵循特定工业协议(如 Modbus),可以在此基础上进行扩展。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 2:14:55

国家电网Java面试被问:代码重构的经验和方法

一、重构的基本原则 1. 重构前必问的问题 java 复制 下载 // 重构检查清单 public class RefactoringChecklist {// 1. 为什么要重构?boolean hasClearGoal checkGoal("性能问题?", // 响应慢、内存泄漏"可读性差?", // 难以…

作者头像 李华
网站建设 2026/9/2 23:06:19

XD原型动效升级:HeyGem加入语音交互预览

XD原型动效升级:HeyGem加入语音交互预览 在内容创作进入“AI工业化”时代的今天,一个令人头疼的问题始终存在:如何让数字人说话时的口型,真正“对得上”它发出的声音?过去,这往往依赖动画师逐帧调整、反复调…

作者头像 李华
网站建设 2026/9/2 23:12:38

基于Playwright与异步技术的公司评价智能爬取实战:以Glassdoor为例

引言:企业评价数据挖掘的价值与挑战在当今数字化商业环境中,企业在线评价已成为影响投资者决策、人才招聘和品牌声誉的关键因素。Glassdoor、Indeed等职业平台积累了海量员工匿名评价,这些数据对于分析企业文化、薪资水平、工作满意度等具有重…

作者头像 李华
网站建设 2026/9/2 23:12:33

Dify平台能否对接HeyGem实现低代码AI视频应用?

Dify平台能否对接HeyGem实现低代码AI视频应用? 在企业内容生产日益智能化的今天,一个典型的需求浮现出来:如何用最低的技术门槛,将一段文字自动变成由数字人播报的视频?尤其在培训、营销和客服场景中,这种“…

作者头像 李华