Как правильно распарсить строку приходящую через com порт

timur2008
Offline
Зарегистрирован: 06.03.2013

Добрый день , подскажите пожалуйста как правильно передать и распарсить строку с данными. Я делаю табло на котором выводится прогноз погоды. Передаю вот такую строку в ардуину

 wheatherType + "t" + temperature + "d" + windtype;

далее в ардуине я ее обрабатываю вот так

int indexTemperature = full.lastIndexOf('t') + 1;
     int indexWindDirection = full.lastIndexOf('d') + 1;
     String wheatherType = full.substring(0,indexTemperature-1); 
     String temperature = full.substring(indexTemperature,indexWindDirection-1);
     String windDirection = full.substring(indexWindDirection ,counts);

     

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

Deamon
Offline
Зарегистрирован: 21.09.2017

не вижу проблемы,

определи t1 t2 t3, d1 d2 d3 и т.д.

 

timur2008
Offline
Зарегистрирован: 06.03.2013

да я уже так и делаю , просто думал может есть какое то другое решение.?

sadman41
Offline
Зарегистрирован: 19.10.2016

Думаю, что всё зависит от того, как вы на табло выводите и в каком объеме. Может вам будет проще сразу сформировать передаваемую строку: "Clouds 25C North", а если их несколько - соединить через разделитель, по которому потом и порубить.

Если же нет, то сформировать пакет, в котором первый символ - wheatherType, второй - windtype, а все остальное до разделителя - температура. Тогда парсинг упрощается. 

Далее - можно передавать не символами, а байтами. Тогда температура, если вам не критичны ее десятые доли, будет кодироваться одним байтом - uint8_t, по-ардуиновски char (тут, конечно, можно и подзапутаться).

Словом, вариантов масса.

timur2008
Offline
Зарегистрирован: 06.03.2013

sadman41 пишет:

Думаю, что всё зависит от того, как вы на табло выводите и в каком объеме. Может вам будет проще сразу сформировать передаваемую строку: "Clouds 25C North", а если их несколько - соединить через разделитель, по которому потом и порубить.

Если же нет, то сформировать пакет, в котором первый символ - wheatherType, второй - windtype, а все остальное до разделителя - температура. Тогда парсинг упрощается. 

Далее - можно передавать не символами, а байтами. Тогда температура, если вам не критичны ее десятые доли, будет кодироваться одним байтом - uint8_t, по-ардуиновски char (тут, конечно, можно и подзапутаться).

Словом, вариантов масса.

эмм а можете объяснить поподробнее про последний вариант ?Например нужно ли как то преобразовывать данные перед тем как их передать через компорт и как как их потом обратно преобразовать из байтов в числа и строки?

sadman41
Offline
Зарегистрирован: 19.10.2016

timur2008 пишет:

эмм а можете объяснить поподробнее про последний вариант ?Например нужно ли как то преобразовывать данные перед тем как их передать через компорт и как как их потом обратно преобразовать из байтов в числа и строки?

Начал писать ответ, но понял, что при использовании String у меня получается геморрой с кучей трансформаций (хотя я всегда избегал класса String и не знаю кун-фу). Так что если вы не готовы перейти к варианту строк вида char[] (https://www.arduino.cc/en/reference/String), то лучше остановиться на втором способе.

timur2008
Offline
Зарегистрирован: 06.03.2013

sadman41 пишет:

timur2008 пишет:

эмм а можете объяснить поподробнее про последний вариант ?Например нужно ли как то преобразовывать данные перед тем как их передать через компорт и как как их потом обратно преобразовать из байтов в числа и строки?

Начал писать ответ, но понял, что при использовании String у меня получается геморрой с кучей трансформаций (хотя я всегда избегал класса String и не знаю кун-фу). Так что если вы не готовы перейти к варианту строк вида char[] (https://www.arduino.cc/en/reference/String), то лучше остановиться на втором способе.

Хорошо понял спасибо :)