Как правильно написать ожидание команды по Serial

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Приветствую!

Есть такая себе плата которая читает данные с датчиков и должна при этом слушать серийный порт. Дабы сэкономить процессорное время я подумал о флаге который будет запускать отдельную функцию распознания содержимого буфера. Флагом играл цифровой вход. Если на него приходит питание, включается функция чтения из буфера порта. Однако работает это нестабильно ибо в буфер записать можно всегда, и послав сигнал просто включается обработка. А иногда нужно сначала подать сигнал, а потом передавать данные на плату. 

Чтобы сделать все стабильнее решил сделать на If(Serial.avaible() > 0) commandRecognition();

Но не заработало. Так как по идее если что-то есть в буфере, то число будет больше нуля. Я и в отдельную переменную записывал кол-во байт буфера, но не срабатывало. Отдельно мониторил число байт и так же не срабатывало. А число байт было 7.

Теперь запутался. Нужен какой-то внешний или сигнал, или определение заполнения буфера чтобы включить функцию распознания команды только когда пришла команда. А не каждый цикл.

Будьте любезны направить, подсказать.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Даже такое есть. Благодарю.

Вот как мне быть с softwareSerial. 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

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

 

vde69
Offline
Зарегистрирован: 10.01.2016

а кто подскажет как получить доступ ко всем данным в  буфере порта?

суть хотелки в следующем:

нужно получить CRC для первых полученых 10 байтов и сравнить с 11 и 12 байтом буфера, если не совпало считываем 1 байт из буфера (уменьшаем его) и повторяем пока не получим нужное, если получили нужное считываем все 12 байт

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

http://arduino.ru/Reference/Serial/Peek

http://arduino.ru/Reference/Serial/Read

Читаем байты? Или это не все читает?

Собираем данные в буфер и так далее.

vde69
Offline
Зарегистрирован: 10.01.2016

это не то...

в буфере лежит

0, 1, 2, 3, 4, 10

мне нужно до чтения буфера сравнить 0+1+2+3 и 4, не прокатывает, тогда из буфера выкидываем первый байт, остается

1, 2, 3, 4, 10

теперь сравниваем 1+2+3+4 и 10 - это то, что нужно берем все :)

собственно во первых мне не хочется тратить время на копирование данных, во вторых организовывать цикличный буфер

vde69
Offline
Зарегистрирован: 10.01.2016

решил расширить себе синтаксис Serial.peek(), теперь в него можно дополнительно указывать один параметр (от 0 до Serial.available()-1) и получать значение из буфера

добавил в HardwareSerial.h

virtual int peek(uint8_t); // надстройка для BusRS485

в HardwareSerial.cpp

int HardwareSerial::peek(uint8_t c) // надстройка для BusRS485
{
  int i = this->available();
  // проверяем, что индекс в рабочем диапазоне
  if (c < i) {
    return _rx_buffer->buffer[(SERIAL_BUFFER_SIZE + c + _rx_buffer->tail) % SERIAL_BUFFER_SIZE];
  } else {
    return -1;
  }
}

проверьте, а то я что-то напутаю а отлавливать будет тяжело.