You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:39:07