如何通过pyserial持续获取静止物体下红外避障模块的数据?
问题分析与解决方案
你的核心问题在于:树莓派是主动持续读取GPIO引脚的电平状态,而Keyes红外避障模块通过PL2303串口输出的是状态变化触发的信号——只有当检测状态(有/无物体)发生改变时,模块才会发送串口数据;静止时状态不变,模块就不再发送新数据,导致你的Python程序收不到数据,但检测灯的电平是持续保持的,所以灯一直亮。
下面是两种解决思路:
思路一:修改Python代码,维护历史状态
既然模块只在状态变化时发数据,我们可以在代码中保存最后一次收到的状态,之后即使没有新数据,也持续输出该状态,模拟树莓派的持续采样效果。
修改后的代码示例
import serial import time # 初始化串口,设置timeout避免阻塞 ser = serial.Serial('COM3', 9600, timeout=0.3) # 保存最后一次检测到的状态,初始为None表示未收到数据 last_detection_status = None if ser.is_open: try: while True: # 读取所有可用的串口数据 received_data = ser.read(ser.in_waiting) if received_data: # 解析数据(需根据模块实际输出调整,示例假设最后1字节为状态位) # 请自行测试:当检测到物体时模块输出的字节值,比如0x00代表有物体,0x01代表无 current_status = received_data[-1] last_detection_status = current_status print(f"[状态更新] {'检测到物体' if current_status == 0 else '未检测到物体'}") elif last_detection_status is not None: # 无新数据,但有历史状态,持续输出当前状态 print(f"[当前状态] {'检测到物体' if last_detection_status == 0 else '未检测到物体'}") else: print("[提示] 未收到模块数据,请检查接线与串口参数") time.sleep(0.3) except Exception as e: print(f"[错误] {str(e)}") ser.close() else: print("[错误] 串口未能打开,请检查端口号与权限")
关键说明
- 你需要自行测试模块的输出格式:比如当物体出现/消失时,模块发送的具体字节值,调整代码中
current_status == 0的判断逻辑。 - 代码通过
last_detection_status变量保留最后一次的有效状态,在无新数据时重复输出,实现类似树莓派的持续状态反馈。
思路二:调整模块输出模式(如果支持)
部分Keyes红外避障模块支持通过跳线或串口指令切换输出模式,将“变化触发输出”改为“持续状态输出”。你可以查看模块的说明书:
- 若有跳线,尝试切换到“持续输出”档位;
- 若支持AT指令,发送对应指令(比如
AT+MODE=CONT,具体指令需参考手册)让模块持续发送当前检测状态。
额外检查项
- 确认PL2303与模块的接线:模块TX接PL2303 RX,模块RX接PL2303 TX,VCC电压匹配(模块一般支持3.3V/5V,PL2303需对应);
- 串口波特率需与模块设置一致(你的代码用9600,确认模块波特率也是9600)。
内容的提问来源于stack exchange,提问作者SeafoodMaster
相关产品推荐
相关产品推荐

