Чтение последовательного ввода в массив символов

#c #arduino #arduino-esp8266

#c #arduino #arduino-esp8266

Вопрос:

Итак, мне удалось подключить модуль 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 != '%') amp;amp; (ESP8266.available())) {
        Serial.print(temp);
        temp = char(ESP8266.read());
      }
      Serial.println("n--------------- END DEBUG ----------------");
    }
  }
}
  

Стандартный ответ, который чип выдает при получении сообщения, выглядит следующим образом:

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

Данные, которые я пытаюсь отправить — случайные значения RGB (с использованием ‘%<‘ и ‘%’ в качестве флагов / маркеров):

 %<255,128,0%
  

Отсюда мне удалось написать приведенный выше код, который распечатает следующее по последовательному:

введите описание изображения здесь

Итак, мне удалось заставить его печатать нужные мне значения через Serial, но, похоже, я не могу хранить их в каком-то массиве, чтобы что-то делать с данными.

Вещи, которые я пробовал:

  • использование ReadString() вместо read() в сочетании с indexOf для поиска / извлечения данных
  • Зацикливание и добавление к массиву символов
  • Куча вещей с массивом кажется сложной, потому что вы должны знать длину, когда вы ее объявляете

В идеале мне нужна функция, которая считывает значение IPD, извлекает данные RGB, а затем разбивает их на 3 индексных массива, например:

 rgbArray = {124, 234, 96};
  

Любая помощь очень ценится!

Ответ №1:

Чтобы сохранить входные данные в массив, просто выделите массив и сохраните в нем данные.

       Serial.println("--------------- DEBUG ----------------A");
      int receivedLength = 0;
      char data[16];
      char temp = ESP8266.available();
      while ((temp != '%') amp;amp; (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 != '%') amp;amp; (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 ----------------");
  

Ответ №2:

В итоге я выбрал другой способ ведения дел:

Удалось прочитать о 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('%');
    }
  }