如何基于串口数据编写if语句?实现收到‘hello’时执行函数
修正后的串口触发代码
下面是修正后的完整代码,解决了串口接收判断的逻辑问题,确保收到hello时稳定执行指定函数:
import serial import time def target_function(): """收到hello后执行的目标函数""" print("触发目标函数:检测到'hello'指令") # 串口配置,根据你的硬件实际参数修改 ser = serial.Serial( port='COM3', # Windows端口示例,Linux为/dev/ttyUSB0等 baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 # 超时时间,避免阻塞 ) # 用于拼接分段接收的数据,防止单次读取不完整 receive_buffer = "" try: while True: # 检查串口是否有可用数据 if ser.in_waiting > 0: # 读取所有可用字节并解码为字符串,去除首尾空白字符 new_data = ser.read(ser.in_waiting).decode('utf-8').strip() receive_buffer += new_data # 判断缓存中是否包含目标指令 if 'hello' in receive_buffer: target_function() # 清空缓存,避免重复触发 receive_buffer = "" time.sleep(0.1) # 降低循环频率,减少资源占用 except KeyboardInterrupt: print("\n用户终止程序") finally: ser.close() print("串口已关闭")
关键修正说明
字节转字符串处理
串口读取的原始数据是bytes类型,必须通过decode('utf-8')转为字符串后才能和'hello'进行字符串匹配,这是最常见的错误点。分段接收缓存
串口通信可能出现数据分段到达的情况(比如'hel'和'lo'分两次发送),通过缓存拼接所有接收数据,确保不会因为分段导致判断失败。去除干扰字符
使用strip()去除数据中的换行符、空格等无关字符,避免因为发送端附带的格式字符导致匹配失败。避免重复触发
触发函数后立即清空缓存,防止同一段hello指令被重复检测执行。
内容的提问来源于stack exchange,提问作者Lukas Sanders
相关产品推荐
相关产品推荐

