Как отображать только определенные данные в serial monitor?

Я получил следующие данные, как показано на рисунке, от бритвы imu, которая подключена к Arduino Mega 2560 в последовательном мониторинге, и я хочу получить только данные, которые начинаются с "#AR= "

Может ли кто-нибудь предоставить мне код для этого?

Это мой код:

#define BUFF_SIZE 40
char buffer[BUFF_SIZE];
String header ;
char Bufferheader[4] ;

void setup(){
Serial.begin(57600);
Serial2.begin(57600);
Serial2.write("#osct");
}

void loop() {

int i = 0;
while(Serial2.available()) {
buffer[i++] = Serial2.read();
if(i == BUFF_SIZE) break;
}

for(int j = 0; j < i; j++) {
Serial.print(buffer[j]);

}
}

, 👍0

Обсуждение

Измените свой код, чтобы он печатал только то, что вы хотите напечатать?, @Majenko

Или остановите последовательный монитор и введите grep '#AR=' /dev/ttyACM0, @Edgar Bonet


2 ответа


1

Ваш код буквально ничего не делает, кроме чтения из одного последовательного порта и передачи его в другой.

Вам нужно выбросить почти весь этот код и заняться фактической обработкой данных.

Вам необходимо:

  1. Читать входящие данные построчно (то есть читать все до строки, заканчивающейся буфером)
  2. Проверьте начало этого буфера
  3. Выведите любые данные из буфера, которые ваши исследования сочтут подходящими.

Я не могу вдаваться в подробности о том, как это сделать, но в Интернете есть учебные пособия по всем этим темам. Для последовательного чтения у меня есть руководство, которое вы может оказаться полезным.

,

2

Метод, описанный Майенко, является общим способом решения этой проблемы. своего рода требование, а также, вероятно, самый «чистый» способ. Если, однако, вы уверены, что входящие данные всегда следуют шаблону, который вы отображаются, то вы можете «обмануть» и срезать углы.

Обратите внимание: в показанном вами образце символ 'A' всегда появляется как второй символ в строке и всегда как часть последовательность "#AR=". Если вы уверены, что это всегда так, то можно применить следующий алгоритм:

  • программа обрабатывает по одному входному символу за раз и решает печатать его на выходе или нет
  • у него есть два возможных состояния: либо он печатает каждый символ, читает (потому что считает, что символ принадлежит строке «#AR») или это не
  • если он печатает и считывает конец строки, он печатает этот конец строку, а затем останавливает печать
  • если он не печатает и читает 'A', он выводит "#A", затем начинает печатать все введенные данные.

В коде:

void loop() {
    static bool printing = false;  // мы печатаем то, что читаем?
    if (Serial2.available()) {
        char c = Serial2.read();
        if (printing) {
            Serial.write(c);
            if (c == '\n')  // в конце строки остановить печать
                printing = false;
        } else if (c == 'A') {  // на 'A' начинаем печатать
            Serial.print("#A");
            printing = true;
        }
    }
}

Этот код предполагает, что ваше устройство использует ASCII LF ('\n') в качестве конца строки. индикатор. Вам придется заменить '\n' на '\r', если он использует ASCII CR вместо этого.

,