Nextion HMI与Arduino Mega 2560数据传输异常问题求助
解决Nextion添加NexNumber后异常的问题
我来帮你分析问题根源,以及对应的解决方案:
问题核心原因
你添加NexNumber后屏幕异常的关键问题是串口通信拥堵:
在loop()函数里,你每次循环都会调用n0.setValue(100)和n1.setValue(200),这会持续不断地向Nextion发送串口指令。Nextion与Arduino通过串口通信,带宽有限,这种高频发送会占满串口资源,导致Nextion无法及时处理触控按钮的消息,甚至自身UI渲染都出现异常。
另外原代码里的kayityazdir()函数使用了delay(2000),这会阻塞整个loop(),在延时期间nexLoop()无法执行,触控事件也无法响应——这个问题在原代码里可能没暴露,但加上高频串口发送后会雪上加霜。
解决方案
1. 优化数值更新逻辑,避免高频发送
不要在每次loop()循环都发送数值,只在需要更新的时候发送(比如初始化时设置一次,或者通过事件触发更新)。如果需要定时更新,用非阻塞的millis()代替循环发送,避免占用过多串口资源。
2. 确认Nextion控件参数匹配
确保你在代码里定义的NexNumber参数和Nextion编辑器里的设置完全一致:
- 第一个参数是页面ID(n0/n1所在的页面编号)
- 第二个参数是控件PID(在Nextion编辑器里查看控件的ID)
- 第三个参数是控件名称(必须和Nextion里的命名完全一致,区分大小写)
修改后的示例代码
#include <Nextion.h> NexDSButton bt0 = NexDSButton(0, 10, "bt0"); NexTouch *nex_Listen_List[] = {&bt0, NULL}; NexNumber n0 = NexNumber(0, 6, "n0"); NexNumber n1 = NexNumber(0, 7, "n1"); // 用于非阻塞定时更新的变量 unsigned long previousMillis = 0; const long updateInterval = 1000; // 每秒更新一次数值,可按需调整 void bt0PopCallback(void *ptr) { kayityazdir(); } void setup() { nexInit(); pinMode(22, OUTPUT); digitalWrite(22, 0); bt0.attachPop(bt0PopCallback); // 初始化时设置一次数值,避免循环重复发送 n0.setValue(100); n1.setValue(200); } void loop() { unsigned long currentMillis = millis(); // 定时更新数值(如果不需要定时,可直接删除这段逻辑) if (currentMillis - previousMillis >= updateInterval) { previousMillis = currentMillis; n0.setValue(100); n1.setValue(200); } nexLoop(nex_Listen_List); digitalWrite(22, 0); } // 改用非阻塞方式实现延时逻辑,避免阻塞loop void kayityazdir() { static unsigned long btnPressMillis = 0; static bool isActive = false; if (!isActive) { digitalWrite(22, 1); btnPressMillis = millis(); isActive = true; } else if (millis() - btnPressMillis >= 2000) { digitalWrite(22, 0); isActive = false; } }
额外提示
- 如果不需要定时更新数值,直接把
setValue放在setup()里执行一次即可,完全不需要在loop()里重复调用。 - 检查Nextion的串口波特率是否和Arduino端
nexInit()默认的波特率一致(默认是9600),如果不一致需要在nexInit()里指定,比如nexInit(115200)。
内容的提问来源于stack exchange,提问作者Selim yılmaz
相关产品推荐
相关产品推荐

