0 голосов

Пытаюсь принять на ESP32 массив из 1419 байт+начальный, конечный символ и разделители, получается очень много. Видимо упирается в размер приемного буфера, потому что на небольшом количестве данных работает.

#define PARSE_AMOUNT 1419       // число значений в массиве, который хотим получить
int intData[PARSE_AMOUNT];// массив численных значений после парсинга

boolean recievedFlag;
boolean getStarted;
byte index;
String string_convert = "";
void parsing() {
  if (Serial.available() > 0) {
    char incomingByte = Serial.read();        // обязательно ЧИТАЕМ входящий символ
    if (getStarted) {                         // если приняли начальный символ (парсинг разрешён)
      if (incomingByte != ',' && incomingByte != ';') {   // если это не запятая И не конец
        string_convert += incomingByte;       // складываем в строку
      } else {                                // если это пробел или ; конец пакета
        intData[index] = string_convert.toInt();  // преобразуем строку в int и кладём в массив
        string_convert = "";                  // очищаем строку
        index++;                              // переходим к парсингу следующего элемента массива
      }
    }
    if (incomingByte == '$') {                // если это <
      getStarted = true;                      // поднимаем флаг, что можно парсить
      index = 0;                              // сбрасываем индекс
      string_convert = "";                    // очищаем строку
    }
    if (incomingByte == ';') {                // если таки приняли > - конец парсинга
      getStarted = false;                     // сброс
      recievedFlag = true;                    // флаг на принятие
    }
  }
}
void setup() {
  Serial.begin(115200);
}
void loop() {
  parsing();       // функция парсинга
  if (recievedFlag) {                           // если получены данные
    recievedFlag = false;
    //for (byte i = 0; i < PARSE_AMOUNT; i++) { // выводим элементы массива
      
    Serial.print(intData[0]); Serial.print(" ");
    Serial.print(intData[1]); Serial.print(" ");
    Serial.print(intData[2]); Serial.print(" ");
    Serial.print(intData[3]); Serial.print(" ");
    Serial.print(intData[4]); Serial.print(" ");
    Serial.print(intData[5]); Serial.print(" ");
    Serial.println();
    } 
  
}

(22 баллов) 1 5 7

1 Ответ

+1 голос
 
Лучший ответ
Всё же просто: создаётся свой буфер необходимого размера и принимается прямо в него.
(2.7 тыс. баллов) 5 27 55
выбран
Как нибудь так:

int incomingByte[1419];
int index;

void setup()
{
Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0) {
    incomingByte[index] = Serial.read();
    index++;
  }
}
Можно так, а можно через указатель.
Обязательно контролировать индекс массива. Си этого не делает.
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...