Как разобрать строку динамического размера?

Jetro
Offline
Зарегистрирован: 25.09.2015

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

Суть вот в чем - по этим данным идет отрисовка графиков на дисплее. Мне нужно разобрать эту строку, после чего в цикле перебрать каждый набор цифр.

В текущий момент у меня эти наборы цифр отправляются по одному, в итоге на пересылку и обработку всех данных уходит почти две минуты, что весьма долго, да и неудобно анализировать на дисплее данные. Вот я и захотел оптимизировать это дело, но вот как обработать строку неизвестной длины придумать не могу, да и гугл не помог, ибо нахожу информацию об обработке статических строк.

 

Ну и сопутствующий вопрос - какой максимальный размер строки может скушать порт ардуины?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

1. Максимальный размер строки, который может скушать порт ардуины (оставим в покое идиотскую формулировку, да?) - неограниченный.

2. Разбирать вам проще всего по приходу разделителя, в вашем случае, запятой. Вот как-то так:

String numberHolder; // здесь будем накапливать строковое представление числа


void process(int number)
{
  // тут обрабатываем пришедшее число
}

void read(char separator) // читаем из порта
{
  char ch;
  while(Serial.available())
  {
    ch = Serial.read();
    if(ch >= '0' && ch <= '9')
      numberHolder += ch;
    else
      if(ch == separator)
      {
        process(numberHolder.toInt());
        numberHolder = "";
      }
  }
}

void loop()
{
  read(','); // читаем числа, разделённые запятой, обрабатываем по одному
}

В порт посылать числа, после каждого числа - запятую. Код писан под положительные числа в десятичной системе, без претензий на безгрешность - просто показал вариант реализации.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

DIYMan пишет:

1. Максимальный размер строки, который может скушать порт ардуины (оставим в покое идиотскую формулировку, да?) - неограниченный.

ну, да. а, может быть равен буферу порта?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Клапауций 232 пишет:

DIYMan пишет:

1. Максимальный размер строки, который может скушать порт ардуины (оставим в покое идиотскую формулировку, да?) - неограниченный.

ну, да. а, может быть равен буферу порта?

А может, всего пару килограмм влезет?

Jetro
Offline
Зарегистрирован: 25.09.2015

DIYMan пишет:

оставим в покое идиотскую формулировку, да?

Так сказать - только на какую формулировку фантазии хватило :)

За код большое спасибо! То что доктор прописал. Правда около часа не мог догнать почему отрисовывается только часть отправденых данных, думал уже оперативки не хватает. А потом понял что полученные данные обработать и отрисовать ардуина попросту не успевает, пришлось понизить скорость порта до 2400 бод, на большей скорости данные начинают теряться.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Jetro пишет:

DIYMan пишет:

оставим в покое идиотскую формулировку, да?

Так сказать - только на какую формулировку фантазии хватило :)

За код большое спасибо! То что доктор прописал. Правда около часа не мог догнать почему отрисовывается только часть отправденых данных, думал уже оперативки не хватает. А потом понял что полученные данные обработать и отрисовать ардуина попросту не успевает, пришлось понизить скорость порта до 2400 бод, на большей скорости данные начинают теряться.

Чтобы данные не терялись в СОМ порту, надо включить управления потоком аппаратное или программное. Либо читать FIFO бурер, котрый очень невелик, в свой большой буфер.