当前位置: 首页 > article >正文

python接入串口数据

第一步:安装所需的库

我们将使用 pyserial 库来处理串口通信。首先需要安装它:

  1. 打开终端或命令提示符。
  2. 执行以下命令安装 PySerial:
    pip install pyserial
    

第二步:基本串口配置和连接

以下是一个基本的 Python 脚本示例,展示如何连接到一个串口设备并读取数据:

import serial

# 你的串口名称(例如 'COM3' 在 Windows 或 '/dev/ttyUSB0' 在 Linux/Mac)
port = 'COM3'

try:
    # 打开串口
    ser = serial.Serial(port, 
                       baudrate=9600,  # 波特率(请根据设备设置调整)
                       bytesize=serial.EIGHTBITS,
                       stopbits=serial.STOPBITS_ONE,
                       parity=serial.PARITY_NONE,
                       timeout=None)  # 无超时(无限等待读取)

    print(f"成功连接到 {port}")

except serial.SerialException:
    print("无法打开串口,请检查串口名称和权限是否正确!")

第三步:读取数据

  1. 异步读取: Default 情况下,timeout=None 配置意味着 read() 方法会阻塞直到有数据可用。可以使用以下代码持续读取数据:

    while True:
        try:
            data = ser.readline()  # 读取一行数据
            if data:
                print("接收到的数据:", data.decode('utf-8'))  # 将字节解码为字符串
        except KeyboardInterrupt:  # 按下 Ctrl+C 退出循环
            break
  2. 定时读取: 如果你需要定期读取数据,可以设置一个超时时间:

    ser.timeout = 1  # 设置超时为1秒
    
    while True:
        try:
            data = ser.read(1024)  # 读取最多1024个字节的数据
            if len(data) > 0:
                print("接收到的数据:", data.decode('utf-8'))
        except KeyboardInterrupt:
            break
        except serial.SerialException as e:
            print("错误:", e)
            break

第四步:发送数据

如果需要向设备发送数据,可以使用以下代码:

# 发送字符串
command = "Hello, Serial Port!"
ser.write(command.encode('utf-8'))
print(f"已发送命令: {command}")

# 或者发 bytearray 格式的数据
data_to_send = bytearray([0x01, 0x02, 0x03])
ser.write(data_to_send)

第五步:处理接收到的数据

接收到的数据通常是 bytes 类型,你可以将其解码为字符串或者其他格式:

  1. 解码成字符串:

    data = ser.readline().decode('utf-8')
    print("已解码的数据:", data)
  2. 以十六进制显示:

    data = ser.readline()
    print("以十六进制显示:", data.hex())

第六步:错误处理和资源释放

  1. 捕获异常: 在 read()write() 时可能会出现异常,例如设备脱离或参数配置错误。确保用 try-except块来捕获这些异常。

  2. 关闭串口连接: 使用完毕后,记得关闭串口释放系统资源:

    ser.close()

第七步:将数据保存到文件

如果需要记录接收的数据,可以直接写入文件:

with open("received_data.log", "wb") as f:
    while True:
        data = ser.read(1024)
        if len(data) > 0:
            f.write(data)

高级功能:同步读取和超时机制

  1. 设置超时时间

    ser.timeout = 5  # 等待最多5秒
    data = ser.read(1024)
  2. 使用 inWaiting() 方法检查数据是否可用

    while True:
        if ser.in_waiting > 0:
            print("接收到的数据:", ser.readline().decode('utf-8'))

测试你的配置

  1. 列出系统中所有可用的串口名称: 使用以下代码查看可用端口:

    import serial.tools.list_ports as port_list
    
    ports = port_list.comports()
    for p in ports:
        print(p)
  2. 验证设备是否工作正常

    • 使用上述代码测试连接。
    • 如果使用了新的串口配置,请确保波特率、数据位、停止位和奇偶校验设置与设备一致。
    • 使用工具如 Tera Term 或 PuTTY 验证你的装置响应。

完整的示例代码

以下是一个完整的、可运行的代码,用于连接串口并读取数据:

import serial

port_name = 'COM3'  # 替换为实际的串口名称
baudrate = 9600     # 根据设备设置调整波特率

try:
    with serial.Serial(port=port_name,
                      baudrate=baudrate,
                      bytesize=serial.EIGHTBITS,
                      stopbits=serial.STOPBITS_ONE,
                      parity=serial.PARITY_NONE) as ser:

        if ser.is_open:
            print(f"成功连接到 {port_name}")

            while True:
                data = ser.readline()
                if len(data) > 0:
                    print("接收到的数据:", data.decode('utf-8'))
                    
                # 按下 Ctrl+C 退出
                try:
                    pass
                except KeyboardInterrupt:
                    break

except serial.SerialException as e:
    print(f"串口连接错误:{e}")
finally:
    print("程序结束,确保已安全关闭串口。")

注意事项:

  1. 串口权限和驱动

    • 在某些系统上,你可能需要管理员权限才能访问串口。
    • 确保安装了正确的设备驱动,并且串口被正确识别。
  2. 波特率和配置

    • 波特率(baudrate)和其他参数必须与设备匹配,否则无法正常通信。
  3. 平台差异

    • Windows 系统中的串口名称通常以 COM 开头(例如 COM1COM2)。
    • 在 Linux 中,串口通常位于 /dev/ttysomething 或 /dev/ttyUSB*
  4. 防止数据丢失: 使用适当的缓冲区或超时机制,以确保不会有太多数据积累而被忽略。


http://www.kler.cn/a/563875.html

相关文章:

  • 地理数据可视化:飞线说明(笔记)
  • 【MATLAB中的图像数据结构】
  • 企业知识库搭建:14款开源与免费系统选择
  • 电商项目-秒杀系统(一)秒杀业务分析
  • MySQL——创建与管理视图
  • 基于 Python 开发分布式任务调度系统案例剖析
  • 《深度学习实战》第2集-补充:卷积神经网络(CNN)与图像分类 实战代码解析和改进
  • 基于CNN的FashionMNIST数据集识别2——模型训练
  • Java+SpringBoot+Vue+数据可视化的在线家具定制服务平台(程序+论文+讲解+安装+调试+售后)
  • 网络安全体系
  • OpenGL 04--GLSL、数据类型、Uniform、着色器类
  • 服务器虚拟化是一种将物理服务器资源(如CPU、内存、存储、网络等)通过软件技术抽象、分割和整合,创建多个独立、隔离的虚拟服务器(虚拟机,VM)的技术。
  • C ++ 静态存储区+堆空间
  • 常见锁类型介绍
  • <网络> 网络基础3
  • AI大模型-提示工程学习笔记20-多模态思维链提示
  • C++ STL(二)deque
  • JVM垃圾回收器深度底层原理分析与知识体系构建
  • 神经网络 - 激活函数(Sigmoid 型函数)
  • 利用粒子群算法(PSO)来优化BP神经网络的权值和阈值