【问题标题】:Serial Printing Variables at a Specific Time Intervals Prints Size of Array Even If Array Is Not Used在特定时间间隔串行打印变量即使不使用数组也会打印数组的大小
【发布时间】:2016-11-11 18:50:13
【问题描述】:

我正在使用 Arduino Uno 和 CD 来模拟装配线,方法是在 CD 的顶部和底部安装传感器,这些传感器读入 Arduino 模拟端口并在每次样品通过时计数。它使用模拟输入来记录信号变高并在信号变低时计数,就像计算数字信号的后沿一样。我想每小时显示一次结果,然后重置计数器,同时将旧值存储在数组中。这些值非常大,所以我将数组和数字声明为无符号长整数。我对我的代码进行了故障排除,除了在特定时间间隔显示结果并存储数组的正确值之外,一切正常。下面是我为测试程序的这个特定部分而编写的代码:

unsigned long spins[200];
unsigned long positives[200];
unsigned long counter=0;
unsigned long greenCounter=0;
int numberofhours=0;
int timer=0;
int hour=3000;

void setup() {

  Serial.begin(115200);

}

void loop() {
  timer==millis();

  if (timer%hour==0){  //if the timer reaches 1 hour, it will print the results, store old and clear values for positive tests and CD spins, and print old values

     numberofhours++;

     spins[numberofhours]=counter;
     positives[numberofhours]=greenCounter;

      Serial.print("\n Number of Hours");
      Serial.print(" ");
      Serial.print(numberofhours);  

      /*  for(int i=0; i<numberofhours; i++){
          Serial.print("\n Number of Spins, Hour");
          Serial.print(" ");
          Serial.print(i);
          Serial.print(";");  
          Serial.print(spins[i]);   
          Serial.print("\n Number of Postives, Hour");
          Serial.print(" ");
          Serial.print(i);
          Serial.print(";");  
          Serial.print(positives[i]);        
        } */
    }



  counter=0;
  greenCounter=0;

  }

注释掉 for 循环后,我每 3000 毫秒从 serial.print 监视器获得这些结果:

小时数 1 小时数 2 小时数 3 ...依此类推,直到: 小时数 198 号码o

注意:第 199 条实际上是这样打印的。

激活 for 循环后,串行监视器上的结果如下所示:

小时数 1 旋转次数,小时 0;0 正数,小时 0;0 小时数 2 旋转次数,小时 0;0 正数,小时 0;0 旋转次数,小时 1;0 正数,小时 1;0 小时数 3 旋转次数,小时 0;0 正数,小时 0;0 旋转次数,小时 1;0 正数,小时 1;0 旋转次数,小时 2;0 正数,小时 2;0 小时数 4

除非这一直持续到 200 小时,这需要比 300 毫秒长得多的时间。然后它会暂停,然后重新开始。如何解决 numberofhours 计数问题,以便将 counter 和 greenCounter 的所有结果存储在数组中与 numberofhours 变量对应的适当位置?

【问题讨论】:

  • 问题其实很简单,当numberofhours大于199时,你试图写出unsigned long spins[200]并产生na异常。如果您想继续,最好的办法是通过将spins[numberofhours]=counter; 替换为spins[(numberofhours % 200)]=counter;positives[] 相同)来管理循环访问。
  • 感谢您的回复。我尝试了您建议的编辑,但 for 循环仍然被注释掉,输出是“如果小时数 x 的数字”,其中 x 似乎随着永恒时钟或其他东西的增加而增加。在不到 1 分钟的时间内,该值就超过了 10,000。似乎一旦输入 if 语句,它就不会退出,而是按预期每 3000 毫秒增加一次 numberofhours
  • 这个错误肯定是由于分配错误timer==millis();而不是timer=millis();
  • 非常感谢!像这样的错误让我失去理智。我真的不能感谢你!

标签: c++ arrays for-loop arduino


【解决方案1】:

你不断地重置你的计数器。在 if 语句中移动重置。

您的代码中似乎缺少某些内容。你在哪里修改 counter 和 greenCounter?此外,numerofhours 将增加超过 199,并且您将索引超出数组的范围。您可能还想添加 Serial.println() 以使您的输出更易于阅读。

【讨论】:

  • 感谢您的回复。 counter 和 greenCounter 变量实际上用于计算相应的模拟电压引脚超过和低于设定阈值的次数。那段代码完全按照预期工作,我将问题隔离到这一部分,所以我用时序和数组线制作了一个新草图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2015-10-09
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多