Arduino项目需要打印报表才能工作

时间:2014-02-18 16:11:34

标签: c++ serial-port arduino led

我有这个我想要运行的Arduino代码,它通过串口从我正在编写的一些c ++代码中侦听输入。这些信息正被写入连接,但我看到Arduino方面有一些非常奇怪的行为。

如果我没有放入print语句(特别是非printRGB()语句),我看不到任何输出到串行控制台。一旦我添加它们,它们就会再次出现。发生了什么事?

#define LED_PIN 13
#define R_PIN 3
#define G_PIN 5
#define B_PIN 6
#define frameBegin ((char) 255)

char colors[] = {
  0,0,0};

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);
  //  establishContact();
  Serial.println("blah");
}

void loop() {
  if (Serial.available() > 0) {
    char inByte = Serial.read();
    toggleLED();
    // Got a new frame
    //Serial.println('S');
    if (inByte == frameBegin) {
      //Serial.println('B');
      //write bass
      boolean allThree = true;
      for (int i=0; i < 3; i++) {
        char rgb = Serial.read();
        if (rgb == frameBegin) {
          //Serial.println('F');
          allThree = false;
          break;
        }
        else {
          colors[i] = rgb;
        }
      }
      if (allThree) {
        //printRGB();
        analogWrite(R_PIN, colors[0]);
        analogWrite(G_PIN, colors[1]);
        analogWrite(B_PIN, colors[2]);
      }
    }
  }
}

void printRGB() {
  Serial.print("rgb: ");
  Serial.print((uint8_t) colors[0]);
  Serial.print(" ");
  Serial.print((uint8_t) colors[1]);
  Serial.print(" ");
  Serial.println((uint8_t) colors[2]);
}

1 个答案:

答案 0 :(得分:0)

这有点奇怪,因为时间和转换。 首先:你等待一个字节加入,放入“inByte”。 我们知道Serial.read()不能返回-1,因为我们确定至少有一个字节。 非常重要:请注意,int中的-1,转换为byte(uint8_t)为255(同样,您的(char)255表示-1,请参阅2的补码以了解原因)

然后你做了一些代码,非常快,但是你可以取消注释Serial.print()会降低它的速度。

然后你读3字节而不确定是否已经收到了3个字节;使用serial.print()你添加了一个延迟,可以让你读取这个字节,但是没有print()你的代码是如此之快(9600波特率意味着960byte / s !!这真的很慢)没有字节到达并且你总是从Serial.read得到一个-1(女巫的意思是“无需阅读”)并将它转换为char(仍为-1),但是然后将其打印为(uint8_t),因此它被赋值并且值为255

在我的arduino uno,IDE 1.5.4上测试