我正在编写一个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。尝试调整波特率。
谢谢!
答案 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) {
........
希望它有所帮助,
米甲