上一篇
Python驱动Windows串口通信完整教程 - 从入门到实践
- Python
- 2025-07-31
- 1835
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发表在吾爱品聚,如有疑问,请联系我们。
本文链接:http://521pj.cn/20256900.html
发表评论