Arduino:Serial.readBytes()在程序运行30-60分钟后收到错误的数据

时间:2015-02-26 00:19:07

标签: arrays serial-port arduino rgb

我正在编写一个Arduino程序,它通过串行和RGB颜色数据(以字节形式发送)接收,用于更新LED链。我的系统工作时间大约30-60分钟,直到我开始在颜色数据中看到明显的毛刺,例如,LED链中不应出现任何绿色,我开始看到绿色。这是代码Arduino方面:

void loop() { 
 if (Serial.available() > 0) {
   if (Serial.peek() == '#') {
     Serial.read();
     read_mac();
     print_mac();
   } else {
     Serial.readBytes(in_data, 3*TOTAL_LEDS);
     for (int i = 0; i < 3 * TOTAL_LEDS; i+=3) {
       leds[i/3].setRGB(in_data[i], in_data[i+1], in_data[i+2]);
     }
   }
 }
 FastLED.show();
}

我在写入串口之前检查了数组的状态,一切看起来都很好。所以,它必须是Arduino方面的东西。

系统在启动时使用代码的第一部分来获取Arduino的MAC地址。对于我如何接收可能导致我所描述的错误的数据,有什么明显的愚蠢行为,例如,我是否应该在某些时候暂停或刷新以确保最佳做法?

更新: 使用USB,而不是RS-232。尝试调整波特率。

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您的问题是您认为:

  

Serial.readBytes(in_data,3 * TOTAL_LEDS);

始终返回3 * TOTAL_LEDS个字节数。但情况可能并非总是如此。 检查Serial.readBytes读取的字节数并循环,直到真正读取3 * TOTAL_LEDS个字节。

我在这里调整了你的代码:

 ..........
 } else {
   byte total_read = 0 ;
   byte *in_data_prt = in_data ;
   while ( total_read < (3 * TOTAL_LEDS) ) {
     byte read = Serial.readBytes(in_data_prt, (3 * TOTAL_LEDS) - total_read) ;
     in_data_prt += read ;
     total_read += read ;       
   }
   for (int i = 0; i < 3 * TOTAL_LEDS; i+=3) {
   ........

希望它有所帮助,

米甲