将串行输入读入字符数组

Read Serial Input into Char Array

所以我已经设法将 ESP-01 模块连接到我的 arduino,现在我正在尝试解析芯片通过串行连接给出的 +IPD 响应。我对 C++ 并不是那么得心应手,但这是我在网上研究了一堆之后设法想出的:

#include <SoftwareSerial.h>
SoftwareSerial ESP8266(2, 3); // RX | TX
int baud = 9600;


void setup() {
  ESP8266.begin(baud);
  Serial.begin(baud);
  Serial.println("--- Start ---");
  
}

void loop() {

  if (ESP8266.available()) // check if the esp is sending a message
  {
    Serial.println("Something received");
    delay(500);
    if (ESP8266.find("%<"))
    {
      Serial.println("--------------- DEBUG ----------------A");
      char temp = {char(ESP8266.read())};
      while ((temp != '%') && (ESP8266.available())) {
        Serial.print(temp);
        temp = char(ESP8266.read());
      }
      Serial.println("\n--------------- END DEBUG ----------------");
    }
  }
}

芯片收到消息时的标准响应如下:

+IPD,<len>:<Message>
+IPD,0,14:%<255,128,0%

我正在尝试发送的数据 - 随机 RGB 值(使用“%<”和“%”作为 flags/markers):

%<255,128,0%

从这里开始,我成功地编写了上面的代码,它将通过串行打印出以下内容:

所以我设法让它通过 Serial 打印我需要的值,但我似乎无法将它们存储在某种数组中以处理数据。

我尝试过的事情:

理想情况下,我想要一个读取 +IPD 值、提取 RGB 数据然后将其拆分为 3 索引数组的函数,如下所示:

rgbArray = {124, 234, 96};

非常感谢任何帮助!

要将输入存储到数组中,只需分配一个数组并将数据存储在那里。

      Serial.println("--------------- DEBUG ----------------A");
      int receivedLength = 0;
      char data[16];
      char temp = ESP8266.available();
      while ((temp != '%') && (ESP8266.available())) {
        Serial.print(temp);
        if (receivedLength < 16) data[receivedLength++] = temp;
      }
      for (int i = 0; i < receivedLength; i++) Serial.print(data[i]);
      Serial.println("\n--------------- END DEBUG ----------------");

或者,您可以在阅读时转换为整数:

      Serial.println("--------------- DEBUG ----------------A");
      int rgbSize = 0;
      int rgbArray[3];
      int currentValue = 0;
      char temp = ESP8266.available();
      while ((temp != '%') && (ESP8266.available())) {
        Serial.print(temp);
        if (temp == ',') {
          if (rgbSize < 3) rgbArray[rgbSize++] = currentValue;
          currentValue = 0;
        } else {
          currentValue = currentValue * 10 + (temp - '0');
        }
      }
      if (rgbSize < 3) rgbArray[rgbSize++] = currentValue;
      for (int i = 0; i < rgbSize; i++) {
        if (i > 0) Serial.print(',');
        Serial.print(rgbArray[i]);
      }
      Serial.println("\n--------------- END DEBUG ----------------");

最终采用了不同的做事方式:

成功阅读了 readStringUntil('');在网络的某个黑暗角落。所以我想出了一个超级肮脏的实现 - 但它有效:

假设您的输入字符串是:

+IPD,0,14:%<255,128,0%

然后做:

if (ESP8266.available()) // check if the esp is sending a message
  {

    delay(500);
    if (ESP8266.find("%<"))
    {
      r = ESP8266.readStringUntil(',');
      g = ESP8266.readStringUntil(',');
      b = ESP8266.readStringUntil('%');
    }
  }