A1_DSP (Data in String Protocol)
A1_DSP состоит из строки с парами (название:данные) оканчивающийся знаком.
Где разделителями между парами являются пробелы виде пробелы.
Сама пара состоит из название (используются строго заглавными латинские буквы), и данных в виде числа ( целого, или с плавающий точкой).
NAME1:123.02 NAME2:321.08;
На выходе требуетса получить либо парный массивы (mas_name[i] mas_d[i], где i порядковый номер)
либо ассоциативного массива по (типу map в c++) mas[NAME1]
Пример строки:
MQV:1.42 VMQ1:0.00 VMQ2:0.07 VIN:11.77 MCVCC:5.00 MCTMP:13.62 LUX:279.00 DHUM:68.43 DTMP:11.23 BPRE:774.10 BTMP:22.02 RDY:1;
MQV:1.42 //Напряжение датчиков MQ
VMQ1:0.00 //Выходное напр датчика 1
VMQ2:0.07 //Выходное напр датчика 2
VIN:11.77 //Входное напряжение
MCVCC:5.00 //Напряжение на шине 5В (atmega328)
MCTMP:13.62 //Температура (atmega328)
LUX:279.00 //Освещённость
DHUM:68.43 //Влажность датчика (DHT21)
DTMP:11.23 //Температура датчика (DHT21)
BPRE:774.10 //Давление (BMP180)
BTMP:22.02 //Температура датчика (BMP180)
RDY:1 //Усреднённые данные 1-готовы 0-нет
Текущий парсер на СИ:
int splint_rtoa(char const *rx, int rs, int rc, char **name_mas, float *dat_mas)
//rx входная строка, rs количество символов в строке, rc количество параметров
{
int i, r, mix = 0;
char tmp[20];
for (i = 0; i < rc; i++)
{
if (name_mas[i] != NULL)
{
for (r = mix; r < rs; r++)
{
if (rx[r] == ':')
{
name_mas[i][r-mix] = '\0';
mix = r + 1;
break;
}
else if(rx[r] == ';' || rx[r] == '\0' || rx[r] == NULL)
{
return rc;
}
else
{
name_mas[i][r - mix] = rx[r];
}
}
for (r = mix; r < rs; r++)
{
if (rx[r] == ' ' || rx[r] == ';')
{
tmp[r - mix] = '\0';
mix = r + 1;
break;
}
else if(rx[r] == '\0' || rx[r] == NULL)
{
return rc;
}
else
{
tmp[r - mix] = rx[r];
}
}
dat_mas[i] = atof(tmp);
}
}
return rc;
}