python serial模块使用方法

 更新时间:2025年12月16日 11:55:15   作者:xingzhemengyou1  
本文详细介绍了如何在Python中使用pySerial库进行串口通信,包括核心步骤、实用技巧、常见问题及解决方案,通过示例代码,展示了如何正确配置串口参数、进行数据读写,并处理异常情况,感兴趣的朋友跟随小编一起看看吧

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

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

一、核心步骤与基础代码

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

安装 pySerial 使用 pip 安装:

pip install pyserial

导入库并打开串口 导入库后,通过 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为非阻塞
)

读写数据

发送数据:使用 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 # 获取接收缓冲区中的字节数

关闭串口 操作完成后,务必关闭串口以释放系统资源。

ser.close()

二、实用技巧与进阶操作

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

import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
for port in ports:
    print(f"设备: {port.device}, 描述: {port.description}")

使用 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'))

多线程处理读写 对于需要同时进行读写操作的应用(如聊天工具、设备监控),可以使用多线程。

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 对象时确保参数与硬件设备完全匹配,并在读写数据时注意字节与字符串的转换。对于复杂应用,可以考虑使用多线程来分离读写逻辑。遇到问题时,应首先检查端口占用、参数匹配和权限设置这些最常见的原因。

到此这篇关于python serial模块使用方法的文章就介绍到这了,更多相关python serial模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python之os路径被转义的问题

    python之os路径被转义的问题

    这篇文章主要介绍了python之os路径被转义的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1的详细步骤

    在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1的

    这篇文章主要介绍了如何在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • Django日志和调试工具栏实现高效的应用程序调试和性能优化

    Django日志和调试工具栏实现高效的应用程序调试和性能优化

    这篇文章主要介绍了Django日志和调试工具栏实现高效的应用程序调试和性能优化,Django日志和调试工具栏为开发者提供了快速定位应用程序问题的工具,可提高调试和性能优化效率,提高应用程序的可靠性和可维护性
    2023-05-05
  • Python爬虫实例——爬取美团美食数据

    Python爬虫实例——爬取美团美食数据

    这篇文章主要介绍了Python爬虫如何爬取美团美食数据,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Django实现drf搜索过滤和排序过滤

    Django实现drf搜索过滤和排序过滤

    当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤。本文就详细的介绍这两种的实现,感兴趣的可以了解一下
    2021-06-06
  • 详解Python 循环嵌套

    详解Python 循环嵌套

    这篇文章主要介绍了Python 循环嵌套的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Python+AutoIt实现界面工具开发过程详解

    Python+AutoIt实现界面工具开发过程详解

    这篇文章主要介绍了Python+AutoIt实现界面工具开发过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 如何在pycharm中配置pyqt5设计GUI操作教程

    如何在pycharm中配置pyqt5设计GUI操作教程

    这篇文章主要介绍了如何在pycharm中配置pyqt5设计GUI的操作教程,有需要的朋友可以借鉴参考下,希望大家可以多多交流,讨论相关问题共同提升
    2021-08-08
  • Python如何生成指定区间中的随机数

    Python如何生成指定区间中的随机数

    这篇文章主要介绍了Python如何生成指定区间中的随机数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 深入理解python try异常处理机制

    深入理解python try异常处理机制

    下面小编就为大家带来一篇深入理解python try异常处理机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06

最新评论