Arduino_parsing_String_2020_11_20 Парсинг строки; разбираем строку на части и конвертируем каждую часть в нужный тип данных L long 4294967295L~ F float 4.56F~ I int 32768I~ C char Str Arduino Part strC~ '~' символ разделения частей строки '#' символ конца строки например 1111I~123456789L~1.17F~String1C~2222I~4294967295L~2.13F~String2C~3333I~3294967293L~3.23F~String3C~# ar1C~ar22C~ar333C~ar4444C~# arduino-IDE v 1.6 */ char arrSerialRead[199] = {0}; // массив char для хранения входящей сырой строки unsigned long longArr[6]; int intArr[6]; float floatArr[6]; char charArr[6][40]; // массивы для хранения обработанных данных /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // Прототипы функций: нужны - чтобы все функции были видны компилятору, вне зависимости от их расположения в коде void FOOparsingString(char * ); void FOOserialReadStr(); /* ################################## */ void setup() { Serial.begin(9600); FOOparsingString("1111I~123456789L~1.17F~String1C~2222I~4294967295L~2.13F~String2C~3333I~3294967293L~3.23F~String3C~#"); // тест } void loop() { while (1) { if (Serial.available())FOOserialReadStr(); } } /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ void FOOserialReadStr() { // функция для принятия сырой строки Serial.println(F("FOOserialReadStr()")); // таймер ожидания следующего байта unsigned long timeout = (millis() + 2000); int indexArrIn = -1; // счетчик индексов массива char inChar = NULL; while (1) { // стоим на месте / зависаем if (Serial.available()) { // если в буфере Serial есть данные timeout = (millis() + 1000); // сохраняем время таймера максимальное Время ожидания следующего байта inChar = (char)Serial.read(); arrSerialRead[++indexArrIn] = inChar; // сохраняем поступившие сырые данные в массив } if ((inChar == '#') || (millis() > timeout))break; // если обнаружен символ конца строки, или истекло время ожидания, выходим } arrSerialRead[(indexArrIn + 1)] = NULL; // ставим флаг конца строки в c++ FOOparsingString(arrSerialRead); // передаём массив / строку, функции FOOparsingString } /* ############################################## */ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ void FOOparsingString(char * arrInStr) { // функция для сортировки данных, в принятой строке Serial.println(F("FOOparsingString()")); Serial.println(arrInStr); int strlenArrInStr = strlen(arrInStr) - 1; // сохраняем индекс - полезную длину строки / массива int8_t l = -1, f = -1, i = -1, c = -1; // если в стоке несколько частей одного формата, распределить их в разные переменные for (int indexInStr = 0, PartStart = 0; indexInStr < strlenArrInStr; indexInStr++) { if (arrInStr[indexInStr] == '~') { // если обнаружен символ разделения частей строки char dataTypes = arrInStr[(indexInStr - 1)]; // сохраняем символ формата, части строки arrInStr[indexInStr - 1] = NULL; // заменяем символ формата, на флаг конца строки c++ if (dataTypes == 'L') {// если символ формата 'L', конвертируем часть строки в long, и сохраняем в массив или переменные long longArr[++l] = atol(arrInStr + PartStart); // если в строке несколько частей с long, сохраняем их в разные переменные ++l Serial.print(F("(long) ")); Serial.print(l); Serial.print(F(" ")); Serial.println(longArr[l]); } else if (dataTypes == 'F') { floatArr[++f] = atof(arrInStr + PartStart); Serial.print(F("(float) ")); Serial.print(f); Serial.print(F(" ")); Serial.println(floatArr[f]); } else if (dataTypes == 'I') { intArr[++i] = atoi(arrInStr + PartStart); Serial.print(F("(int) ")); Serial.print(i); Serial.print(F(" ")); Serial.println(intArr[i]); } else if (dataTypes == 'C') { ++c; // если в сырой строке несколько частей со "строками", сохраняем их в разные переменные for (int i = 0; i < (indexInStr - PartStart); i++)charArr[c][i] = (arrInStr[(PartStart + i)]); Serial.print(F("(char Str) ")); Serial.print(c); Serial.print(F(" ")); Serial.println(charArr[c]); } PartStart = indexInStr + 1; // запоминаем стартовый индекс, индекс начала для следующей части строки } } } /* ############################################## */
Arduino АРДУИНО УРОКИ СКЕТЧИ
/*
Arduino_parsing_String_2020_11_20
Парсинг строки; разбираем строку на части и конвертируем каждую часть в нужный тип данных
L long 4294967295L~
F float 4.56F~
I int 32768I~
C char Str Arduino Part strC~
'~' символ разделения частей строки
'#' символ конца строки
например
1111I~123456789L~1.17F~String1C~2222I~4294967295L~2.13F~String2C~3333I~3294967293L~3.23F~String3C~#
ar1C~ar22C~ar333C~ar4444C~#
arduino-IDE v 1.6
*/
char arrSerialRead[199] = {0}; // массив char для хранения входящей сырой строки
unsigned long longArr[6]; int intArr[6]; float floatArr[6]; char charArr[6][40]; // массивы для хранения обработанных данных
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
// Прототипы функций: нужны - чтобы все функции были видны компилятору, вне зависимости от их расположения в коде
void FOOparsingString(char * );
void FOOserialReadStr();
/* ################################## */
void setup() {
Serial.begin(9600);
FOOparsingString("1111I~123456789L~1.17F~String1C~2222I~4294967295L~2.13F~String2C~3333I~3294967293L~3.23F~String3C~#"); // тест
}
void loop() {
while (1) {
if (Serial.available())FOOserialReadStr();
}
}
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
void FOOserialReadStr() { // функция для принятия сырой строки
Serial.println(F("FOOserialReadStr()")); // таймер ожидания следующего байта
unsigned long timeout = (millis() + 2000);
int indexArrIn = -1; // счетчик индексов массива
char inChar = NULL;
while (1) { // стоим на месте / зависаем
if (Serial.available()) { // если в буфере Serial есть данные
timeout = (millis() + 1000); // сохраняем время таймера максимальное Время ожидания следующего байта
inChar = (char)Serial.read();
arrSerialRead[++indexArrIn] = inChar; // сохраняем поступившие сырые данные в массив
}
if ((inChar == '#') || (millis() > timeout))break; // если обнаружен символ конца строки, или истекло время ожидания, выходим
}
arrSerialRead[(indexArrIn + 1)] = NULL; // ставим флаг конца строки в c++
FOOparsingString(arrSerialRead); // передаём массив / строку, функции FOOparsingString
}
/* ############################################## */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
void FOOparsingString(char * arrInStr) { // функция для сортировки данных, в принятой строке
Serial.println(F("FOOparsingString()"));
Serial.println(arrInStr);
int strlenArrInStr = strlen(arrInStr) - 1; // сохраняем индекс - полезную длину строки / массива
int8_t l = -1, f = -1, i = -1, c = -1; // если в стоке несколько частей одного формата, распределить их в разные переменные
for (int indexInStr = 0, PartStart = 0; indexInStr < strlenArrInStr; indexInStr++) {
if (arrInStr[indexInStr] == '~') { // если обнаружен символ разделения частей строки
char dataTypes = arrInStr[(indexInStr - 1)]; // сохраняем символ формата, части строки
arrInStr[indexInStr - 1] = NULL; // заменяем символ формата, на флаг конца строки c++
if (dataTypes == 'L') {// если символ формата 'L', конвертируем часть строки в long, и сохраняем в массив или переменные long
longArr[++l] = atol(arrInStr + PartStart); // если в строке несколько частей с long, сохраняем их в разные переменные ++l
Serial.print(F("(long) "));
Serial.print(l);
Serial.print(F(" "));
Serial.println(longArr[l]);
}
else if (dataTypes == 'F') {
floatArr[++f] = atof(arrInStr + PartStart);
Serial.print(F("(float) "));
Serial.print(f);
Serial.print(F(" "));
Serial.println(floatArr[f]);
}
else if (dataTypes == 'I') {
intArr[++i] = atoi(arrInStr + PartStart);
Serial.print(F("(int) "));
Serial.print(i);
Serial.print(F(" "));
Serial.println(intArr[i]);
}
else if (dataTypes == 'C') {
++c; // если в сырой строке несколько частей со "строками", сохраняем их в разные переменные
for (int i = 0; i < (indexInStr - PartStart); i++)charArr[c][i] = (arrInStr[(PartStart + i)]);
Serial.print(F("(char Str) "));
Serial.print(c);
Serial.print(F(" "));
Serial.println(charArr[c]);
}
PartStart = indexInStr + 1; // запоминаем стартовый индекс, индекс начала для следующей части строки
}
}
}
/* ############################################## */