返回顶部
分享到

python serial模块使用方法

python 来源:互联网 作者:佚名 发布时间:2025-12-16 21:57:00 人浏览
摘要

在Python中实现串口通信,最常用且功能强大的库是pySerial(通常通过import serial导入) 。它支持跨平台操作(Windows、Linux、macOS),提供了完整的串口访问功能。 一、核心步骤与基础代码 实现串

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

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

一、核心步骤与基础代码

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

安装 pySerial 使用 pip 安装:

1

pip install pyserial

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

1

2

3

import serial

# 基础示例:打开 COM3,波特率 9600

ser = serial.Serial('COM3', 9600)

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

1

2

3

4

5

6

7

8

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)类型。

1

2

ser.write(b'Hello, World!')  # 发送字节数据

ser.write("Hello\r\n".encode('utf-8'))  # 将字符串编码为字节后发送

读取数据:常用 read()、readline() 或检查 in_waiting 属性。

1

2

3

data = ser.read(10)           # 读取10个字节

line = ser.readline()          # 读取一行,直到换行符

bytes_waiting = ser.in_waiting # 获取接收缓冲区中的字节数

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

1

ser.close()

二、实用技巧与进阶操作

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

1

2

3

4

import serial.tools.list_ports

ports = serial.tools.list_ports.comports()

for port in ports:

    print(f"设备: {port.device}, 描述: {port.description}")

使用 with 语句自动管理资源 使用 with 语句可以确保串口在代码块结束后被正确关闭,即使发生异常也是如此。

1

2

3

4

with serial.Serial('COM3', 9600, timeout=1) as ser:

    ser.write(b'AT\r\n')

    response = ser.readline()

    print(response.decode('utf-8'))

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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。

四、完整示例代码

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 在Mac上安装最新版本Python的方法

    在Mac上安装最新版本Python的方法
    所有最新的 MacOS(从 macOS 12.3 开始)都预装了 Python 版本(通常是 Python 2.x),但它已经过时并且不再受支持。要充分利用 Python 的功能,您
  • python serial模块使用方法
    在Python中实现串口通信,最常用且功能强大的库是pySerial(通常通过import serial导入) 。它支持跨平台操作(Windows、Linux、macOS),提供了完
  • pytorch中torch.cat和torch.stack的区别

    pytorch中torch.cat和torch.stack的区别
    torch.cat和torch.stack是 PyTorch 中用于组合张量的两个常用函数,它们的核心区别在于输入张量的维度和输出张量的维度变化。以下是详细对比:
  • Python实现快速扫描目标主机的开放端口和服务
    功能介绍 这是一个功能强大的端口扫描器脚本,能够快速扫描目标主机的开放端口和服务。该脚本具备以下核心功能: 多种扫描模式:支持
  • Python轻松实现Word到Markdown的转换
    在文档管理、内容发布等场景中,将 Word(.doc/.docx)转换为 Markdown 格式是常见需求。Markdown 的轻量、跨平台、易编辑特性,使其更适配网页
  • python可变/不可变对象及+=和=+举例
    在Python开发中,可变对象与不可变对象是一个高频基础概念,也是初学者容易混淆的难点。这两类对象的核心差异不仅影响变量赋值、函数
  • Python使用Spire.XLS for Python实现高效读取Excel数据
    在当今数据驱动的世界中,Python 已成为数据处理和分析的首选工具。而 Excel 文件作为最常见的数据存储格式之一,如何高效、准确地在 P
  • 安装scrapy框架并测试全过程

    安装scrapy框架并测试全过程
    安装scrapy框架并测试 这是个系列文章,主要是能让大家快速的的做出一个小项目,主要是我现在在做计算机设计大赛,想把做过的东西记录
  • Python实现PDF文档高效转换为HTML文件
    一、为什么需要PDF转HTML 在数字化办公场景中,PDF因其格式固定、跨平台兼容性强成为文档分发的主流格式。但PDF的静态特性限制了内容复用
  • Python使用Appium实现自动化操作手机入门教学

    Python使用Appium实现自动化操作手机入门教学
    在当今移动互联网时代,手机应用已经成为人们日常生活中不可或缺的一部分。随着移动应用的快速发展,自动化测试和手机操作的需求也
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计