news 2026/9/22 3:41:16

python serial模块使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python serial模块使用

在Python中实现串口通信,最常用且功能强大的库是pySerial(通常通过import serial导入)

。它支持跨平台操作(Windows、Linux、macOS),提供了完整的串口访问功能。

一、核心步骤与基础代码

实现串口通信通常遵循以下步骤:

  1. 安装 pySerial使用 pip 安装:

    pip install pyserial
  2. 导入库并打开串口导入库后,通过serial.Serial()创建并打开串口连接。关键参数包括端口号(port)和波特率(baudrate)。

    import serial # 基础示例:打开 COM3,波特率 9600 ser = serial.Serial('COM3', 9600)

    更完整的参数配置示例如下:

    ser = serial.Serial( port='COM3', # Windows端口,Linux下如 '/dev/ttyUSB0' baudrate=9600, # 波特率 bytesize=serial.EIGHTBITS, # 数据位,默认为8 parity=serial.PARITY_NONE, # 校验位,默认为无 stopbits=serial.STOPBITS_ONE, # 停止位,默认为1 timeout=1 # 读超时时间(秒),None为阻塞读取,0为非阻塞 )
  3. 读写数据

    • 发送数据:使用write()方法,参数必须是字节(bytes)类型。
      ser.write(b'Hello, World!') # 发送字节数据 ser.write("Hello\r\n".encode('utf-8')) # 将字符串编码为字节后发送
    • 读取数据:常用read()readline()或检查in_waiting属性。
      data = ser.read(10) # 读取10个字节 line = ser.readline() # 读取一行,直到换行符 bytes_waiting = ser.in_waiting # 获取接收缓冲区中的字节数
  4. 关闭串口操作完成后,务必关闭串口以释放系统资源。

    ser.close()

二、实用技巧与进阶操作

  1. 自动检测可用串口在不确定端口号时,可以自动列出所有可用串口。

    import serial.tools.list_ports ports = serial.tools.list_ports.comports() for port in ports: print(f"设备: {port.device}, 描述: {port.description}")
  2. 使用with语句自动管理资源使用with语句可以确保串口在代码块结束后被正确关闭,即使发生异常也是如此。

    with serial.Serial('COM3', 9600, timeout=1) as ser: ser.write(b'AT\r\n') response = ser.readline() print(response.decode('utf-8'))
  3. 多线程处理读写对于需要同时进行读写操作的应用(如聊天工具、设备监控),可以使用多线程。

    import threading import time def read_from_port(ser): while True: if ser.in_waiting > 0: data = ser.readline().decode('utf-8').strip() print(f"收到: {data}") def main(): ser = serial.Serial('COM3', 9600, timeout=1) read_thread = threading.Thread(target=read_from_port, args=(ser,)) read_thread.daemon = True # 设置为守护线程,主程序退出时自动结束 read_thread.start() # 主线程可以处理发送或其他逻辑 while True: message = input("输入要发送的消息 (输入quit退出): ") if message.lower() == 'quit': break ser.write((message + '\r\n').encode('utf-8')) ser.close()

三、常见问题与解决方案

问题现象可能原因解决方案
SerialException: could not open port端口号错误、端口被其他程序占用、权限不足(Linux常见)使用list_ports.comports()确认端口名;关闭占用程序(如串口调试助手);在Linux下使用sudo chmod 666 /dev/ttyUSB0或将自己加入dialout用户组。
读取数据为空或超时波特率等参数与设备不匹配、设备未发送数据、timeout设置过短确认设备与代码的波特率、数据位、停止位、校验位完全一致;使用串口调试工具验证设备是否正常发送数据;适当增加timeout参数值。
数据乱码编码不一致、串口参数不匹配使用ser.read()获取原始字节后,用正确的编码(如'utf-8''gbk')解码;再次核对并统一所有串口参数。
'bool' object is not callable错误地将属性is_open当作方法调用,写成了ser.is_open()正确写法应为ser.is_open,这是一个属性而非方法。
AttributeError: module 'serial' has no attribute 'Serial'库安装冲突或错误正确的库名是pyserial,但导入时使用import serial。如果出错,可以尝试卸载后重新安装:pip uninstall serial pyserial,然后pip install pyserial

四、完整示例代码

以下是一个结合了错误处理、参数配置和简单读写功能的完整示例:

import serial import serial.tools.list_ports def list_available_ports(): """列出所有可用串口""" ports = serial.tools.list_ports.comports() if not ports: print("未找到可用串口设备。") return None print("可用串口设备:") for idx, port in enumerate(ports): print(f" [{idx}] {port.device} - {port.description}") return ports def main(): # 1. 列出并选择端口 available_ports = list_available_ports() if not available_ports: return port_index = int(input("请选择要打开的串口编号: ")) selected_port = available_ports[port_index].device # 2. 配置并打开串口 try: with serial.Serial( port=selected_port, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=2 # 设置读取超时为2秒 ) as ser: print(f"串口 {ser.name} 已成功打开。") # 3. 发送数据 send_data = b'Hello from Python!\r\n' ser.write(send_data) print(f"已发送: {send_data.decode('utf-8', errors='ignore').strip()}") # 4. 尝试读取数据 if ser.in_waiting: received_data = ser.read(ser.in_waiting) print(f"接收到原始数据: {received_data}") try: print(f"解码后: {received_data.decode('utf-8')}") except UnicodeDecodeError: print("数据无法用UTF-8解码,可能为二进制数据。") else: print("未接收到数据。") except serial.SerialException as e: print(f"串口操作出错: {e}") except KeyboardInterrupt: print("\n程序被用户中断。") except Exception as e: print(f"发生未知错误: {e}") if __name__ == "__main__": main()

这个示例整合了自动端口列表、使用with语句进行资源管理、基本的读写操作以及异常处理,是一个可以直接运行和修改的起点。

总结来说,使用Python进行串口通信的核心是正确安装和导入pyserial库,在创建Serial对象时确保参数与硬件设备完全匹配,并在读写数据时注意字节与字符串的转换。对于复杂应用,可以考虑使用多线程来分离读写逻辑。遇到问题时,应首先检查端口占用、参数匹配和权限设置这些最常见的原因。

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

实习面试题-JavaScript 面试题

1.JavaScript 有哪些数据类型?它们的区别是什么? JavaScript 有八种基本数据类型,分为原始类型(Primitive Types)和引用类型(Reference Types): 原始类型 1)Undefined:表示变量未初始化。一个变量声明后但未赋值时,它的默认值是 undefined。 2)Null:表示一个空…

作者头像 李华
网站建设 2026/9/21 8:37:55

解决‘此扩展程序不再受支持’问题:FLUX.1-dev开发环境兼容性优化方案

FLUX.1-dev开发环境兼容性优化:从问题到实践的深度解析 在浏览器插件开发的世界里,一个看似无害的提示——“此扩展程序不再受支持”——往往能让整个项目陷入停滞。尤其是当它出现在你基于最新AI模型构建的文生图工具中时,那种挫败感尤为强烈…

作者头像 李华
网站建设 2026/9/21 11:32:04

火山引擎AI大模型生态中FLUX.1-dev的独特定位分析

火山引擎AI大模型生态中FLUX.1-dev的独特定位分析 在AIGC浪潮席卷内容创作领域的今天,一个核心问题始终困扰着从业者:如何让AI真正“听懂”复杂的视觉指令?无论是广告设计师反复修改提示词却得不到理想构图,还是电商平台需要批量生…

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

抖音直播回放永久保存指南:告别内容丢失的烦恼

抖音直播回放永久保存指南:告别内容丢失的烦恼 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为错过精彩直播而懊恼吗?🤔 当你看到心仪主播的直播,想要永…

作者头像 李华
网站建设 2026/9/20 13:21:15

Bypass Paywalls Clean完整使用教程:快速解锁全网付费内容

Bypass Paywalls Clean是一款专为Chrome浏览器设计的强大扩展工具,能够智能绕过各类网站的付费墙限制,让您免费访问原本需要付费订阅的优质内容。无论您是新闻阅读者、学术研究者还是商业分析师,这款工具都能为您提供便捷的内容获取体验。 【…

作者头像 李华
网站建设 2026/9/21 17:58:37

国产CAD实现铸造与热处理工艺的标准化控制

铸造、热处理等特种工艺,其质量在很大程度上依赖于对过程参数(如温度、时间)的精确控制。过去,这些参数多依赖于老师傅的个人经验,存在波动性。为实现质量的稳定与均一,必须将个人经验转化为可重复、可验证…

作者头像 李华