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; }