Как правильно написать ожидание команды по Serial
- Войдите на сайт для отправки комментариев
Приветствую!
Есть такая себе плата которая читает данные с датчиков и должна при этом слушать серийный порт. Дабы сэкономить процессорное время я подумал о флаге который будет запускать отдельную функцию распознания содержимого буфера. Флагом играл цифровой вход. Если на него приходит питание, включается функция чтения из буфера порта. Однако работает это нестабильно ибо в буфер записать можно всегда, и послав сигнал просто включается обработка. А иногда нужно сначала подать сигнал, а потом передавать данные на плату.
Чтобы сделать все стабильнее решил сделать на If(Serial.avaible() > 0) commandRecognition();
Но не заработало. Так как по идее если что-то есть в буфере, то число будет больше нуля. Я и в отдельную переменную записывал кол-во байт буфера, но не срабатывало. Отдельно мониторил число байт и так же не срабатывало. А число байт было 7.
Теперь запутался. Нужен какой-то внешний или сигнал, или определение заполнения буфера чтобы включить функцию распознания команды только когда пришла команда. А не каждый цикл.
Будьте любезны направить, подсказать.
https://www.arduino.cc/en/Tutorial/SerialEvent
Даже такое есть. Благодарю.
Вот как мне быть с softwareSerial.
Не подскажу, не было нужды, возможно, получится сделать аналогично. Либо есть более другой, более простой вариант.
а кто подскажет как получить доступ ко всем данным в буфере порта?
суть хотелки в следующем:
нужно получить CRC для первых полученых 10 байтов и сравнить с 11 и 12 байтом буфера, если не совпало считываем 1 байт из буфера (уменьшаем его) и повторяем пока не получим нужное, если получили нужное считываем все 12 байт
http://arduino.ru/Reference/Serial/Peek
http://arduino.ru/Reference/Serial/Read
Читаем байты? Или это не все читает?
Собираем данные в буфер и так далее.
это не то...
в буфере лежит
0, 1, 2, 3, 4, 10
мне нужно до чтения буфера сравнить 0+1+2+3 и 4, не прокатывает, тогда из буфера выкидываем первый байт, остается
1, 2, 3, 4, 10
теперь сравниваем 1+2+3+4 и 10 - это то, что нужно берем все :)
собственно во первых мне не хочется тратить время на копирование данных, во вторых организовывать цикличный буфер
решил расширить себе синтаксис Serial.peek(), теперь в него можно дополнительно указывать один параметр (от 0 до Serial.available()-1) и получать значение из буфера
добавил в HardwareSerial.h
в HardwareSerial.cpp
проверьте, а то я что-то напутаю а отлавливать будет тяжело.