Разбор строк приема Arduino

В настоящее время я использую геолокацию Google, чтобы получить данные о местоположении на один nodemcu и отправить их через последовательный порт на другой Arduino. Последовательная команда, которую я получаю прямо сейчас,

1.450187T103.824745 

Я использую следующий код для анализа.

 if (Serial.available())  {
    char c = Serial.read();  //получает один байт из последовательного буфера
    //if (c == '\n') { //ищет маркер конца пакета данных
    if (c == '\n') {
     // Serial.println(readString); //выводит строку в последовательный порт
      //делаем что-то
      substring = readString.substring(0,8);
      lati = substring;
      loc = readString.indexOf("T");
      substring = readString.substring(loc+1, loc+11);
     longi = substring;
       readString=""; //очищает переменную для нового ввода
      substring=""; 

    }  
    else {     
      readString += c; // делает строку readString
    }
  }

Это работает в большинстве случаев, но иногда я также получаю "T" внутри строки. вот так

lat=1.450146&longi=102464T103

Что не так в моем коде?

, 👍0

Обсуждение

какова причина передачи H? ... вам нужна только T, чтобы разделить два значения, @jsotola

Можете ли вы показать нам настоящую серийную строку, которую вы получили в этом случае?, @chrisl


2 ответа


Лучший ответ:

1

с readBytesUntil и строкой C

if (Serial.available()) {
  char buff[32];
  int l = Serial.readBytesUntil('\n', buff, sizeof(buff));
  if (l > 0 && buff[l - 1] == '\r') {
    l--; // удалить \r, если он есть
  }
  buff[l] = 0; // завершаем строку
  char* p = strchr(buff,'T'); // возвращает указатель в строке
  if (p != NULL) {
    *p = 0; // записываем 0 как char в указатель, чтобы завершить первую часть
    p++; // перемещаем указатель на следующий символ
    Serial.println(buff);
    Serial.println(p);
  } else {
    Serial.println(buff);
  }
}
,

0

Вы можете использовать цикл for, чтобы получить расположение буквы "T", а затем разделить String на 2 Strings.

// 4104 байта.
String readString = "1.450187T103.824745";
String lati, longi;

void setup(){

  Serial.begin(9600);

  // делаем код
  for(int i = 0; i < readString.length(); i++){
    if(readString.charAt(i) == 'T'){
      lati = readString.substring(0, i);
      longi = readString.substring(i + 1);
      break;
    }
  }

  Serial.print("lati=");
  Serial.println(lati);
  Serial.print("longi=");
  Serial.println(longi);

}

void loop(){}
,

Зачем использовать String.substring() при проверке одного символа? Почему бы не получить доступ к массиву символов напрямую?, @chrisl

Основываясь на коде OP, я предположил, что они хотели использовать объект String, а не строку в стиле C (массив char). Конечно, массив char является предпочтительным методом, и я уверен, что размер компиляции будет намного меньше при его использовании., @VE7JRO

Я изменил String.substring() на String.charAt(), и размер компиляции уменьшился на 102 байта. Спасибо @chrisl., @VE7JRO