A1_DSP

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