上一篇
Python驱动Windows串口通信完整教程 - 从入门到实践
- Python
- 2025-07-31
- 1643
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()
示例说明:
- 使用上下文管理器(with语句)自动处理串口打开和关闭
- 模拟生成温度传感器数据
- 每2秒发送一次传感器数据
- 实时读取串口接收到的数据
- 支持通过Ctrl+C安全退出程序
五、常见问题与解决方案
问题1:串口访问被拒绝(PermissionError)
原因:串口已被其他程序占用
解决方案:
- 关闭其他使用该串口的程序
- 检查设备管理器中是否有冲突
问题2:数据接收不完整或乱码
原因:波特率等参数设置不正确
解决方案:
- 确认双方设备使用相同的波特率、数据位、停止位和奇偶校验
- 尝试降低波特率
- 检查物理连接是否可靠
问题3:无法找到串口
原因:驱动未安装或设备未识别
解决方案:
- 检查设备管理器查看设备状态
- 安装正确的USB转串口驱动程序
- 尝试更换USB端口
问题4:程序突然停止响应
原因:缓冲区溢出或读取阻塞
解决方案:
- 设置合理的timeout值
- 使用readline()时确保数据包含换行符
- 使用多线程处理串口通信
© 2023 Python串口通信教程 | 本教程提供完整的Python串口编程解决方案
本文由JiangZu于2025-07-31发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://liuhe.jltcw.com/20256900.html
发表评论