Набросал в VisualStudio, под Arduino сами переделаете Код (Text): #include "stdafx.h" #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) { char inputString[] = "42,50,0\n43,51,1\n44,52,2\n";// исходный "поток символов" int values[3];// массив для хранения распарсенных чисел char part[4];// чтобы влезло максимальное число - "100" + символ конца строки '\0' char* pStr = inputString; int valueIndex = 0; int symbolIndex = 0; while(*pStr != '\0') { // имитируем Serial.read() char c = *pStr; if(c == '\n' || c == ',') { part[symbolIndex] = '\0'; values[valueIndex] = atoi(part); if(c == '\n') { valueIndex = 0; for(int i = 0; i < 3; i++) printf("%d ", values); printf("\n"); } else { valueIndex++; } symbolIndex = 0; } else { part[symbolIndex++] = c; } pStr++;// пошли на следующий символ } return 0; } На первом курсе универа нас на программировании заставляли заниматься одной полезной вещью: рисовать на листочке табличку, где в заголовках колонок были названия переменных, а в заголовках строк - номер итерации. Берешь такую табличку, идешь по коду с карандашиком и вписываешь значения переменных в таблицу на каждом шаге. Очень здорово помогало понять логику выполнения кода. Попробуйте на досуге
Смотрю на код как баран на новые ворота , даже не понимаю где тут переменные куда значения команд запишутся... а от int _tmain(int argc, _TCHAR* argv[]) страшно просто становится (не только мне,но и arduino при компиляции ругается) ушел учить мат часть
Вот так попробуйте Код (Text): int values[3];// массив для хранения распарсенных чисел char part[4];// массив для собирания в него кусочков строки типа "12,34,56\n" int valueIndex = 0;// номер очередного кусочка строки int symbolIndex = 0;// номер очередного символа очередного кусочка строки void setup() { } void loop() { int x; int y; int z; if(DataReady()) { // данные обновились, можно их использовать x = values[0]; y = values[1]; z = values[2]; } } // функция возвращает true, если принята и распарсена очередная строка типа "12,34,56\n" boolean DataReady() { if(!Serial.available()) return false; char c = Serial.read(); if((c != '\n') && (c != ',')) { part[symbolIndex++] = c; } else { part[symbolIndex] = '\0'; values[valueIndex] = atoi(part); if(c == '\n') { symbolIndex = 0; valueIndex = 0; return true; } else { valueIndex++; symbolIndex = 0; return false; } } }
Огромное спасибо, все заработало как надо. теперь буду разбираться как это всё работает Вообще тема очень полезная для новичков получилась.
Добрый день, мне конечно в программе понятно многое , но меня вводит в ступор char *str = inputString; правильно ли я понимаю , когда мы пишем str++, уже без * мы инкрементируем счетчик указателя на элемент массива *str , и в общем то char *str = inputString; это тоже самое если бы мы написали char str[7] ="L,2,5,5,R,1,9,0\r" и командой per1=str[0]; вызвали бы нулевой элемент массива "L", так?
Все верно, это просто 2 различные формы записи одной и той же операции. Выражение pointer[x] означает буквально "к указателю pointer прибавить X раз размер этого указателя и взять элемент, находящийся по получившемуся адресу" и именно таким образом выполняется.