跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
|注册
博客列表

目录

  1. 1. 安装 PySerial
  2. 2. 基本使用流程
  3. 2.1 导入库并打开串口
  4. 初始化串口连接,参数可在此处设置
  5. 2.2 检查串口状态
  6. 2.3 读写数据
  7. 发送字符串(需编码为字节)
  8. 或直接发送字节数据
  9. 2.4 关闭串口
  10. 3. 常用方法与属性
  11. 4. 实际应用示例
  12. 5. 常见问题与注意事项
  13. 总结
Python

Python PySerial 串口通信库入门与实战

本文介绍 Python PySerial 库的使用方法。涵盖安装、基本流程(导入、打开、读写、关闭)、常用方法与属性、实际代码示例以及常见问题排查。PySerial 支持跨平台串口通信,通过配置波特率等参数实现设备交互,适用于嵌入式开发及硬件控制场景。

漫步发布于 2026/3/30更新于 2026/4/131 浏览

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 等
    baudrate=9600,        # 波特率,常见值有 9600, 115200 等
    bytesize=serial.EIGHTBITS,  # 数据位,8 位
    parity=serial.PARITY_NONE,  # 校验位,无校验
    stopbits=serial.STOPBITS_ONE, # 停止位,1 位
    timeout=1             # 读超时时间(秒),None 为无限等待,0 为非阻塞
)

创建 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 读写数据
  • read(size=1):读取指定大小的字节数。
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • HunyuanVideo-Foley 技术解析及 AIGC 音频赛道融资趋势
  • Java 分治算法实战:快速排序与归并排序
  • Python IDLE 使用指南:掌握 Python 自带集成开发环境
  • Spring Boot 入门:环境搭建与第一个应用
  • PowerShell Invoke-WebRequest 报 Invalid URL 和 CommandNotFound 解决方案
  • OpenClaw v2026.3.1 版本更新:本地 AI Agent 功能升级与 Android 集成
  • Python Selenium 浏览器自动化基础与实战教程

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown 转 HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online

  • HTML 转 Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • 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)
    

    写入数据:使用 write() 方法,参数必须是字节类型(bytes)。

    # 发送字符串(需编码为字节)
    ser.write("Hello, Serial!".encode('utf-8'))
    # 或直接发送字节数据
    ser.write(b'\x01\x02\x03')
    
    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),可以在此基础上进行扩展。

    风电短期算法:机组传播图 GNN + 阵风风险预警落地框架
  • Python 中如何打开和查看 .npz 文件
  • Redis Hash 类型详解
  • Python 爬虫高频问题与解决方案
  • C++ 算法刷题:气球排列、迷宫搜索与主持人调度
  • OpenClaw 对接飞书机器人配置踩坑:消息无响应与 Gateway 断开排查
  • GpuGeek 平台:AI 开发者与中小企业的算力解决方案
  • 飞牛 NAS 安装部署 Gitea
  • C++ 特殊类设计:不可拷贝、堆栈限制与单例模式实现
  • OpenClaw Web UI 无法访问 Not Found 问题排查
  • AI 绘画在商业设计中的应用与版权探讨
  • MiniMax 海螺 AI 视频:图片与文本生成高质量视频
  • llama.cpp 新增 Web UI,本地大模型部署性能与体验升级