Разбор ответа из serial по переменным
- Войдите на сайт для отправки комментариев
Втр, 01/03/2016 - 23:01
Всем Привет!
Имеется связка Arduino+LCD+ESP8266. Через UDP связка подключена к компьютеру, через которую идет передача данных с помощью AT команд. Данные от Ардуино в компьютер приходят и обрабатываются нормально в среде LabView засчёт фильтра, а вот от компьютера в Ардуино приходят в таком вот виде: +IPD,9:Dannye Ap
Естественно, отображается на LCD точно также. Вопрос - как разобрать ответ и отобразить данные на LCD без лишнего мусора? Я так понимаю, надо играться с парсингом, но из имеющихся примеров с буффером и sscanf у меня ничего не вышло - тупо не возвращает ничего...
Помогите написать, если это возможно. Запутался уже...
То, что я написал, ниже.
void loop() {
while (Serial.available() > 0)
lcd.clear();
lcd.setCursor(0, 0);
String data_in = Serial.readString();
data_in.toCharArray(buffer,7);
data_lcd=strtok(buffer,":");
Serial.println (data_lcd);
lcd.write( data_lcd );
Работающая версия, которая выдает всю строчку вместе с мусором...
void loop() { if (Serial.available()) { delay(100); lcd.clear(); lcd.setCursor(0, 0); while (Serial.available() > 0) lcd.write(Serial.read()); } }А служебные символы за тебя Пушкин вычищать будет? А данные на валидность проверять?
google://CRLF
https://www.arduino.cc/en/Reference/StringTrim
Позвольте. При чем тут эти пустые символы? Речь то сейчас о другом.
как-то так, проверять вживую лень.
String inputString = ""; // буфер для хранения всей строки из Serial String valueName; int valueID; String valueData; boolean stringComplete = false; // флаг что есть данные в Serial void setup() { Serial.begin(9600); inputString.reserve(20); } void loop() { while (Serial.available()) // если в Serial что-то есть... { char inChar = (char)Serial.read(); //... то заполняем буфер inputString += inChar; if (inChar == '\n') stringComplete = true; // ставим флаг что есть данные } if (stringComplete) // если есть флаг { Serial.println(inputString); valueName = inputString.substring(1,3); // читаем символы со 2 по 4 String id = inputString.substring(5,6); // читаем 5-й символ valueID = id.toInt(); // переводим 5-й символ в число valueData = inputString.substring(7); // читаем c 7 символа и до конца lcd.clear(); lcd.setCursor(0, 0); lcd.print("Name:"); lcd.print(valueName); lcd.setCursor(0, 8); lcd.print("ID:"); lcd.print(valueID); lcd.setCursor(1, 0); lcd.print("Data:"); lcd.print(valueData); if(valueName == "IPD") { //что-то делаем } inputString = ""; // очищаем буфер stringComplete = false; // снимаем флаг } }Позвольте. При чем тут эти пустые символы? Речь то сейчас о другом.
Говно прилетело в порт, говно из буфера прочитал, говно на дисплей вывел. Причем тут говно?
#76
как-то так, проверять вживую лень.
Блин, точно же! забыл про substring! Спасибо!
хоть работает?
Да что-то не очень. Немного изменил код, но инфу всё-равно не выводит... Выводит тупо пустые строки на дисплей, а в приемнике UDP пишет просто пустоту.
R[192.168.1.41:10010]:
Измененный код ниже. Строчка, которую посылаю - S[192.168.1.41:10010]: mod1.start.2321111
String inputString = ""; // буфер для хранения всей строки из Serial String namemod; String param; String datapar; boolean stringComplete = false; // флаг что есть данные в Serial .... while (Serial.find("mod1")) // если в Serial найдено слово mod1... { char inChar = (char)Serial.read(); //... то заполняем буфер inputString += inChar; if (inChar == '\n') stringComplete = true; // ставим флаг что есть данные } if (stringComplete=true) // если есть флаг { Serial.println(inputString); namemod = inputString.substring(0,4); // читаем символы со 1 по 4 param = inputString.substring(5,10); // читаем символы с 6 по 11 datapar = inputString.substring(11); // читаем c 13 символа и до конца // lcd.clear(); lcd.setCursor(0, 0); lcd.print("Nm:"); lcd.print(namemod); lcd.setCursor(8, 0); lcd.print("Pr:"); lcd.print(param); lcd.setCursor(0, 1); lcd.print("Dt:"); lcd.print(datapar); inputString = ""; // очищаем буфер stringComplete = false; // снимаем флаг }Нахрена каст в 11?
Что за дикое сравнение в 13?
\n = 13 = 0xD
\r = 10 = 0xA