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

Python驱动Windows串口通信完整教程 - 从入门到实践

Python驱动Windows串口通信完整教程

在Windows系统中使用Python进行串口通信的实践指南

一、串口通信基础

串口通信是一种通过串行接口进行数据传输的方式,广泛应用于工业控制、嵌入式系统、传感器数据采集等领域。在Windows系统中,串口通常被标识为COM1、COM2等。

串口通信关键参数:

  • 波特率 - 数据传输速率(如9600, 115200)
  • 数据位 - 每个字节的数据位数(通常为8位)
  • 停止位 - 表示数据包结束的位数(1, 1.5或2位)
  • 奇偶校验 - 错误检测机制(none, even, odd)
  • 流控制 - 数据传输控制(none, RTS/CTS, XON/XOFF)

二、环境配置与库安装

1. 安装pyserial库

pyserial是Python中最常用的串口通信库,支持Windows、Linux和macOS系统。

pip install pyserial

2. 查找可用串口

在Windows系统中,可以通过以下方法查找可用的串口:

  • 设备管理器 → 端口(COM和LPT)
  • 使用Python代码自动检测

Python检测串口代码示例:

import serial.tools.list_ports

# 获取所有可用串口
ports = serial.tools.list_ports.comports()

if not ports:
    print("没有找到可用串口!")
else:
    print("可用串口列表:")
    for port in ports:
        print(f"- {port.device}: {port.description}")

三、Python串口通信基础操作

1. 打开和配置串口

import serial

# 创建串口对象
ser = serial.Serial()

# 配置串口参数
ser.port = 'COM3'      # 串口号
ser.baudrate = 9600    # 波特率
ser.bytesize = 8       # 数据位
ser.parity = 'N'       # 奇偶校验 (N: None, E: Even, O: Odd)
ser.stopbits = 1       # 停止位
ser.timeout = 1        # 读取超时时间(秒)

# 打开串口
try:
    ser.open()
    print(f"串口 {ser.port} 已成功打开")
except serial.SerialException as e:
    print(f"打开串口失败: {e}")

2. 向串口写入数据

# 发送文本数据
message = "Hello, Serial Port!"
ser.write(message.encode('utf-8'))

# 发送十六进制数据
hex_data = bytes([0xAA, 0xBB, 0x01, 0x02])
ser.write(hex_data)

3. 从串口读取数据

# 读取一行数据 (直到遇到换行符)
line = ser.readline().decode('utf-8').strip()
print(f"收到: {line}")

# 读取指定字节数
data = ser.read(10)  # 读取10个字节
print(f"收到数据: {data.hex()}")

# 读取所有可用数据
while ser.in_waiting > 0:
    data = ser.read(ser.in_waiting)
    print(f"收到数据: {data}")

4. 关闭串口

# 关闭串口连接
ser.close()
print("串口已关闭")

四、完整示例:串口温度监控

以下是一个完整的Python串口通信示例,模拟从串口读取温度传感器数据:

import serial
import time
import random

# 模拟温度传感器数据
def generate_sensor_data():
    temperature = round(20 + random.uniform(-5, 5), 1)
    humidity = round(45 + random.uniform(-10, 10), 1)
    return f"TEMP:{temperature},HUM:{humidity}\n"

# 主函数
def main():
    # 配置串口参数
    port = 'COM3'
    baudrate = 9600
    
    try:
        # 创建并打开串口
        with serial.Serial(port, baudrate, timeout=1) as ser:
            print(f"已连接到串口 {port},波特率 {baudrate}")
            print("开始接收数据... (按Ctrl+C退出)")
            
            # 主循环
            while True:
                # 模拟从串口读取数据
                if ser.in_waiting:
                    data = ser.readline().decode('utf-8').strip()
                    print(f"收到: {data}")
                
                # 每隔2秒发送一次模拟数据
                time.sleep(2)
                sensor_data = generate_sensor_data()
                ser.write(sensor_data.encode('utf-8'))
                print(f"发送: {sensor_data.strip()}")
                
    except serial.SerialException as e:
        print(f"串口错误: {e}")
    except KeyboardInterrupt:
        print("程序已终止")

if __name__ == "__main__":
    main()

示例说明:

  1. 使用上下文管理器(with语句)自动处理串口打开和关闭
  2. 模拟生成温度传感器数据
  3. 每2秒发送一次传感器数据
  4. 实时读取串口接收到的数据
  5. 支持通过Ctrl+C安全退出程序

五、常见问题与解决方案

问题1:串口访问被拒绝(PermissionError)

原因:串口已被其他程序占用

解决方案:

  • 关闭其他使用该串口的程序
  • 检查设备管理器中是否有冲突

问题2:数据接收不完整或乱码

原因:波特率等参数设置不正确

解决方案:

  • 确认双方设备使用相同的波特率、数据位、停止位和奇偶校验
  • 尝试降低波特率
  • 检查物理连接是否可靠

问题3:无法找到串口

原因:驱动未安装或设备未识别

解决方案:

  • 检查设备管理器查看设备状态
  • 安装正确的USB转串口驱动程序
  • 尝试更换USB端口

问题4:程序突然停止响应

原因:缓冲区溢出或读取阻塞

解决方案:

  • 设置合理的timeout值
  • 使用readline()时确保数据包含换行符
  • 使用多线程处理串口通信

© 2023 Python串口通信教程 | 本教程提供完整的Python串口编程解决方案

发表评论