Разбор строк приема 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
Что не так в моем коде?
@Nisal, 👍0
Обсуждение2 ответа
Лучший ответ:
с 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);
}
}
Вы можете использовать цикл 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
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- Последовательная связь между ESP8266 и Arduino Uno
- Arduino Преобразование std:string в String
- Как связаться с датчиком через порты RX/TX Arduino?
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
какова причина передачи
H
? ... вам нужна толькоT
, чтобы разделить два значения, @jsotolaМожете ли вы показать нам настоящую серийную строку, которую вы получили в этом случае?, @chrisl