Разбор ответа из serial по переменным

AntonM
Offline
Зарегистрирован: 22.10.2015

Всем Привет!

Имеется связка 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 );

 

AntonM
Offline
Зарегистрирован: 22.10.2015

Работающая версия, которая выдает всю строчку вместе с мусором...

void loop() {
  if (Serial.available()) {
    delay(100);
    lcd.clear();
    lcd.setCursor(0, 0);
    while (Serial.available() > 0) 
      lcd.write(Serial.read());
  }
}

Radjah
Offline
Зарегистрирован: 06.08.2014

А служебные символы за тебя Пушкин вычищать будет? А данные на валидность проверять?

google://CRLF

https://www.arduino.cc/en/Reference/StringTrim

 
AntonM
Offline
Зарегистрирован: 22.10.2015

Позвольте. При чем тут эти пустые символы? Речь то сейчас о другом.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

как-то так, проверять вживую лень.

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; // снимаем флаг
  }
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

AntonM пишет:

Позвольте. При чем тут эти пустые символы? Речь то сейчас о другом.

Говно прилетело в порт, говно из буфера прочитал, говно на дисплей вывел. Причем тут говно?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

#76

AntonM
Offline
Зарегистрирован: 22.10.2015

 

Tomasina пишет:

как-то так, проверять вживую лень.

Блин, точно же! забыл про substring! Спасибо!

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

хоть работает?

AntonM
Offline
Зарегистрирован: 22.10.2015

Да что-то не очень. Немного изменил код, но инфу всё-равно не выводит... Выводит тупо пустые строки на дисплей, а в приемнике 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; // снимаем флаг
  }

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Нахрена каст в 11?

Что за дикое сравнение в 13?

\n = 13 = 0xD

\r = 10 = 0xA