【问题标题】:Arduino Project Needs Print Statements to WorkArduino 项目需要打印报表才能工作
【发布时间】:2014-02-18 16:11:34
【问题描述】:

我有这个 Arduino 代码,我想运行它来侦听我正在编写的一些 c++ 代码通过串行输入的输入。此信息正在写入连接,但我在 Arduino 端看到了一些非常奇怪的行为。

如果我不将打印语句放入(特别是非 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]);
}

【问题讨论】:

  • 如果您不将任何内容打印到连载中,您希望阅读什么内容?您自己的命令不会出现,因为它们不是由 arduino 编写的,并且串行监视器不会给您提供您所写内容的日志。
  • 参见 printRGB()。在我得到一个表示“帧”开始的特定字节并且我得到我期望的值的数量之后调用它。
  • 如果你删除它,你将看不到任何东西,因为它永远不会被调用。我不明白这有什么问题。为什么您希望在 SerialConsole 上读取一些内容,删除在串行上写入该值的代码?
  • 糟糕,对不起!在从 repo 中提取代码之前粘贴代码:D。现在更新 - 查看 serial.println("b") serial.println("s") 等。始终保留 printRGB(),没有 println("B"/"S") RGB 值永远不会打印.

标签: c++ serial-port arduino led


【解决方案1】:

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

然后你做一些代码,速度非常快,但你可以取消注释 Serial.print() 女巫会减慢它。

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

在我的 arduino uno IDE 1.5.4 上测试

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2016-05-25
    • 1970-01-01
    • 2020-06-23
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多