Как отображать только определенные данные в 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]);
}
}
@MMM, 👍0
Обсуждение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
вместо этого.
- Как разделить входящую строку?
- Какова максимальная длина провода для последовательной связи между двумя Arduino?
- Последовательная связь между двумя Arduino (запрос и получение)
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Как правильно получить MIDI с Arduino, с 6n138?
- Bluetooth-модуль HC-05 не принимает AT-команды
- Дождаться получения ВСЕХ последовательных данных.
Измените свой код, чтобы он печатал только то, что вы хотите напечатать?, @Majenko
Или остановите последовательный монитор и введите
grep '#AR=' /dev/ttyACM0
, @Edgar Bonet