#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('%');
}
}