Guard子句导致arduino程序挂起

Guard clause causes arduino program to hang

我在 Controllino Automation Maxi (Arduino Mega) 上有一个程序,它在 if 语句中使用了保护子句。

唯一的问题是,如果子句的计算结果为真,并且 return 被执行,Controllino 将重新启动。我不知道为什么。

  #define CHILLER_TEMP_UPPER_THRESH 16.0
  #define CHILLER_NOMINAL 8.0

  if (chillTempOutlet >= CHILLER_TEMP_UPPER_THRESH)
  {
    if (hasChillCriticalNotifSent) return; //don't send notification if it has already been sent
      
    sendTempCriticalNotifcation(CHILLER_NOMINAL, chillTempOutlet);
    hasChillCriticalNotifSent = true;
  }

在试验时我输入了 return 0; 而我收到了这个警告:

src\main.cpp: In function 'void loop()':
src\main.cpp:1065:43: warning: return-statement with a value, in function returning 'void' [-fpermissive]
     if (hasChillCriticalNotifSent) return 0; 

这让我相信 return 实际上退出了 loop() 函数而不是 if 语句,在 Arduino 上我认为这意味着它退出到虚无中?

在这种情况下如何使用保护子句?我可以在第一个 if 中创建一个 and,但还有什么我可以做的吗?我最初关于退出虚无的理论是否正确?

return returns 来自调用函数或方法。

breakwhile, dofor 块时爆发。

如果有左括号,ifelse 块在右括号处结束。

the return actually exits the loop() function

正确。很高兴你收到了警告。而且您的 Arduino 不会 挂起 。循环的结束只是下一个循环的开始。

一种可能的方法是检查它是否未发送,然后才执行其他代码。

    if (chillTempOutlet >= CHILLER_TEMP_UPPER_THRESH)
    {
      if (hasChillCriticalNotifSent == false)
      {
           sendTempCriticalNotifcation(CHILLER_NOMINAL, chillTempOutlet);
           hasChillCriticalNotifSent = true;
      }   
    }