如何发送带有事件的串行数据?

时间:2019-04-04 15:01:33

标签: arduino serial-port arduino-esp8266

我正在使两个arduino通过Serial进行通信。它有效,但是存在结构性问题:当我从一个arduino发送数据时,另一个不知道她收到了什么...

是否可以为每个通信添加一个“标题”;一种与事件进行正确通信的方法,就像使用套接字或HTTP一样。 有图书馆可以实现这一目标吗?

我想对JSON进行序列化和反序列化,以便在数据中添加一个“标题”,但这太过分了。

1 个答案:

答案 0 :(得分:0)

您可以使用类似于serial.parseint()的方法来中断串行传输,然后寻找标题。如果用逗号分隔所有逗号,那么您将知道第一个解析出来的将是标题。解析逗号的ar​​duino示例如下所示:

void loop() {
  // if there's any serial available, read it:
  while (Serial.available() > 0) {

    // look for the next valid integer in the incoming serial stream:
    int red = Serial.parseInt();
    // do it again:
    int green = Serial.parseInt();
    // do it again:
    int blue = Serial.parseInt();

    // look for the newline. That's the end of your sentence:
    if (Serial.read() == '\n') {
      // constrain the values to 0 - 255 and invert
      // if you're using a common-cathode LED, just use "constrain(color, 0, 255);"
      red = 255 - constrain(red, 0, 255);
      green = 255 - constrain(green, 0, 255);
      blue = 255 - constrain(blue, 0, 255);

      // fade the red, green, and blue legs of the LED:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);

      // print the three numbers in one string as hexadecimal:
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
  }
}

获取标头后,可以执行switch()语句以检查大小写: 例如

while (Serial.available() > 0) {
     int header = Serial.parseInt();
     ...
     switch (header){
         case header1:
           code here...
           break;
         case header2:
           code here...
           break;
         default:
           break;
    }