【问题标题】:Serial.read() skips over serial inputSerial.read() 跳过串行输入
【发布时间】:2017-08-04 21:05:24
【问题描述】:

尝试使用 Arduino Uno 和标准 IDE 发送串行消息。解析发送到设备的串行消息时遇到问题。

请注意,如果我包含此行Serial.println("Serial.available() = " + String(Serial.available()));,我将能够阅读邮件的其余部分。如果将其注释掉,我将只看到消息的第一个字母并跳过其余部分。我看到的带有和不带有添加的代码行的输出的附加图像。

// the setup routine runs once when you press reset:
void setup() {

  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  while (!Serial) {} // wait for serial to be initialized

  Serial.println("Setup called. Serial port ready.");

  Serial.println("Waiting for time sync message...");
  while (!Serial.available()) {}
  processSyncMessage();
}

void processSyncMessage() {

  // parse first letter of message
  char messageHeader = (char) Serial.read();

  switch (messageHeader) {
    case TIME_HEADER:
       // do processing
      break;
    default:
      Serial.println("Unknown message sent with header: " + String(messageHeader));

      // must include this line in order to see the entire message sent
      // just calling a println or a Serial.available() doesn't work ????
      Serial.println("Serial.available() = " + String(Serial.available()));

      Serial.println("---start of message");
      for (int r = 0; r != -1; r = Serial.read()) {
        Serial.print((char) r);
      }
      Serial.println();
      Serial.println("---end of message");
      break;
  }
}

Missing Buffer

With printout

这是否与缓冲区有关?我可以用fflush(SOME_SECRET_BUFFER) 以某种方式刷新它吗?

【问题讨论】:

  • Arduino 不是 C,已删除标签。 Serial.println("Serial.available() = " + String(Serial.available())); 证明了这一点
  • setup() 只被调用一次。您应该定义一个 loop() 函数并将 setup() 的最后 3 行代码移入其中以进行连续操作。

标签: c++ arduino arduino-uno arduino-ide


【解决方案1】:

您是否尝试过 Serial.readString() 来解析整个缺失的字符?

【讨论】:

  • 如果它不符合您的要求,您可以设置 readString() 的超时时间,但这不太可能
【解决方案2】:

串行数据一次发送和接收一个字符。在 9600 波特率下,传输速率约为每毫秒一个字符。

代码假定一旦第一个字符到达,所有字符都已到达。不是这种情况。 println 的添加会消耗 CPU 时间,因此具有添加延迟的效果。此延迟允许接收原始消息的其余部分。

这里需要一个为您的应用程序设置适当超时的接收函数。

【讨论】:

  • 你能举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多