树莓派3与Nextion HMI通过FT232通信按键响应延迟问题求助
优化方案:解决Nextion按键响应延迟问题
核心问题分析
你的代码采用ser.read(ser.in_waiting)读取所有缓冲数据,但Nextion的按键返回帧是固定7字节结构(0x65 + 组件ID + 事件类型 + 0x00 + 0xFF 0xFF 0xFF)。当串口数据分批次到达时,单次读取可能只拿到部分帧,导致程序需要等待后续字节凑齐完整帧才会匹配,这就是延迟的根源。而Arduino的Nextion库是按固定帧长读取,避免了这个问题。
具体优化措施
1. 固定读取完整帧长度
修改读取逻辑,每次读取固定7字节(Nextion按键事件帧的标准长度),确保拿到完整的响应帧:
import serial import binascii # 初始化串口,添加超时参数避免阻塞 ser = serial.Serial('/dev/ttyUSB1', 9600, timeout=0.1) while True: # 等待凑齐完整的7字节帧再读取 if ser.in_waiting >= 7: data = ser.read(7) hex_data = binascii.hexlify(data).decode('utf-8') if hex_data == '65010200ffffff': print("Button 1") # 此处调用你的目标函数 elif hex_data == '65010300ffffff': print("Button 2") elif hex_data == '65010400ffffff': print("Button 3")
2. 优化串口参数配置
添加串口超时、关闭不必要的流控,减少通信等待:
ser = serial.Serial( port='/dev/ttyUSB1', baudrate=9600, timeout=0.1, # 100ms超时,避免无限阻塞 rtscts=False, dsrdtr=False )
3. 简化数据匹配逻辑(可选,提升效率)
直接比较字节序列而非转成十六进制字符串,减少转换开销:
import serial # 预定义按键对应的字节帧 BUTTON1_FRAME = b'\x65\x01\x02\x00\xff\xff\xff' BUTTON2_FRAME = b'\x65\x01\x03\x00\xff\xff\xff' BUTTON3_FRAME = b'\x65\x01\x04\x00\xff\xff\xff' ser = serial.Serial('/dev/ttyUSB1', 9600, timeout=0.1) while True: if ser.in_waiting >= 7: data = ser.read(7) if data == BUTTON1_FRAME: print("Button 1") elif data == BUTTON2_FRAME: print("Button 2") elif data == BUTTON3_FRAME: print("Button 3")
4. 平衡CPU占用与响应速度(可选)
在循环中添加短暂延迟,避免树莓派CPU空转:
import time while True: if ser.in_waiting >= 7: # 读取和处理逻辑 time.sleep(0.01) # 10ms延迟,不影响响应速度的同时降低CPU负载
额外检查项
- 确认Nextion显示屏的按键事件设置:确保按键的
Touch Press事件为单次触发,而非长按触发(在Nextion编辑器的组件属性中调整) - 检查FT232接线:确认TX/RX交叉连接正确,电源供电稳定(电压不足可能导致通信延迟)
内容的提问来源于stack exchange,提问作者Michal Grzelak
相关产品推荐
相关产品推荐

