Парсинг и прием данных из серийного порта

artem.barovik

✩✩✩✩✩✩✩
21 Окт 2022
20
1
Оформи код соответствующим тэгом
Здравствуйте, пытаюсь принимать цвета rgb( в формате 255,255,255;) Использую библиотеки AsyncStream и GParser. Но получается что он находит что-то еще и я не очень понимаю откуда берутся дополнительные элементы.

C++:
#include <AsyncStream.h>

AsyncStream<50> serial(&Serial2, ';');

void loop() {

  while (serial.available()) {

    Serial.println(serial.buf);

     parsing1();

  }

void parsing1() {

  while (serial.available()) {

    Serial.println(serial.buf);

  }

  GParser rgb(serial.buf, ',');

  int am = rgb.split();

  for (int i = 0; i < am; i++) Serial.println(rgb);

  strip.fill(mRGB(rgb.getInt(0), rgb.getInt(1), rgb.getInt(2)));

  strip.show();

  delay(2000);

}
 

Вложения

Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Дополнительные элементы это конец строки и возврат каретки. Они у вас прописаны чуть левее скорости обмена данными в мониторе порта (NL ^ CR)
 

artem.barovik

✩✩✩✩✩✩✩
21 Окт 2022
20
1
@Старик Похабыч, попробовал выставить без этих символов, такое чувство что парсинг происходит 2 раза вместо одного, и переписывает данные.
C++:
void loop() {
  while (serial.available()) {
    Serial.println(serial.buf);
     parsing();
  }
 
}

void parsing() {
  int rgb[3];
  int count = 0;        // счётчик интов
  char* offset = serial.buf;   // указатель для работы
  while (true) {
    rgb[count++] = atoi(offset); // пишем число в буфер
    offset = strchr(offset, ','); // поиск следующей запятой
    if (offset) offset++;         // если это не NULL - продолжаем
    else break;                   // иначе покидаем цикл
  }

  for (int i = 0; i < count; i++) Serial.println(rgb[i]);
  strip.fill(mRGB(rgb[0], rgb[1], rgb[2]));
  strip.show();
}
parsing1.PNG
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Странный какой парсер.
Но допустим. Обращение к буферу убирает данные из самого буфера ?
если обращаться через read , то буфер уменьшается. А вот при чтении буфера не знаю. Там не функция. Может после парсинга стоит буфер чистить ?
 

artem.barovik

✩✩✩✩✩✩✩
21 Окт 2022
20
1
@Старик Похабыч, я использую библиотеку https://github.com/GyverLibs/AsyncStream . Мой буфер получается это массив char. При попытке его обнулить выдает ошибку( невозможно привести к типу char[1] to char[100].
Парсер я использую как в примере AlexGaver для парсинга челых чисел. Еще раз мой код.

C++:
#include <AsyncStream.h>
AsyncStream<50> serial(&Serial2, ';');

#define STRIP_PIN 2     // пин ленты
#define NUMLEDS 8      // кол-во светодиодов
#define COLOR_DEBTH 3
#include <microLED.h>   // подключаем библу


microLED<NUMLEDS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2818, ORDER_GRB, CLI_AVER> strip;
void setup() {
  Serial.begin(115200);
  Serial2.begin(115200);
  strip.setBrightness(150);
  strip.clear();
  strip.show(); // вывод изменений на ленту
  delay(1);     // между вызовами show должна быть пауза минимум 40 мкс !!!!

}

void loop() {
  while (serial.available()) {
    //Serial.println(serial.buf);
     parsing();
  }
}

void parsing() {
  int rgb[3];
  int count = 0;        // счётчик интов
  char* offset = serial.buf;   // указатель для работы
  while (true) {
    rgb[count++] = atoi(offset); // пишем число в буфер
    offset = strchr(offset, ','); // поиск следующей запятой
    if (offset) offset++;         // если это не NULL - продолжаем
    else break;                   // иначе покидаем цикл
  }
  for (int i = 0; i < count; i++) Serial.println(rgb[i]);
  strip.fill(mRGB(rgb[0], rgb[1], rgb[2]));
  strip.show();
  delay(2000);
 
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Даже не смотрел эту библиотеку, но Гавер достаточно подробно все расписывает. Значит явно что то упускается в коде.
Но т.к. целая строка выводится нормально, а 0 это конец строки, то проверьте коды символов перед нулем, что это за знаки ?
Можно просто вывести весь буфер по символам и проанализировать их. т.е. строка 255,30,47 по симиволам будет выглядеть так:
50,53,53,44,51,48,44,34,55
что будет соотв. символам
2,5,5, , ,3, 0, , , 4, 7
а вот сл. 2 символа как раз и будут сильно интересовать.
 
  • Лойс +1
Реакции: artem.barovik

artem.barovik

✩✩✩✩✩✩✩
21 Окт 2022
20
1
@Старик Похабыч, вчера весь день думал, пробовал, а сегодня на свежую голову додумался) Проблема была на стороне отправителя, я посылал в порт с помощью println. А значит он ставил конец строки и я получал код+ символ конца строки, а парсер читал до ";" , и в буфере еще лежал символ конца строки отправленный передатчиком. Спасибо за помощь)
 
  • Лойс +1
Реакции: Старик Похабыч