即使串行可用,代码也会保持循环

时间:2018-03-10 17:20:58

标签: c++ for-loop arduino serial-port

我正在使用外部应用程序将我的RGB外设与我的WS2812B Strip同步。我想在应用程序未运行时创建一个可以切换到的默认颜色,但在软件中启用条带2秒后,它会恢复为我设置的默认颜色(255,255,255)。

#include <Adafruit_NeoPixel.h> 
#define PIN 6
#define NUMPIXELS 30

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + 
NEO_KHZ800);

void setup() {
  pixels.begin();
  Serial.begin(19200, SERIAL_8E1);
}

void loop() {
  for (int w = 0; w < NUMPIXELS; w++) {
    pixels.setPixelColor(w, 255, 255, 255);
  }    
  pixels.show();
  int w = 0;
  if (Serial.available()) {
    int n = 0;
    for (int n = 0; n < 3; n++) {
      byte rgb[3];
      Serial.readBytes(rgb, 3);
      uint32_t r = int(rgb[0]);
      uint32_t g = int(rgb[1]);
      uint32_t b = int(rgb[2]);
      for (int i = 0; i < NUMPIXELS; i++) {
        pixels.setPixelColor(i, r, g, b);
      }
      pixels.show();
    }
  }
}

1 个答案:

答案 0 :(得分:1)

函数Serial.available()做的不是你期望的事情:

如果有可用的通信伙伴,您希望它返回。而是检查是否有可供读取的字节:

  

获取可从串行端口读取的字节数(字符数)。 (来源:https://www.arduino.cc/en/Serial/Available

这意味着:您的Arduino已经用完了要读取的字节数,因为它会过快地清空管道。因此,由于没有更多的字节需要读取,它只会使LED显示为白色。

旁注:if条件应该更改以反映这一点(参见Arduino网站上的帖子):

if (Serial.available() > 0) {