Контрольную сумму может тебе передавать?
Придумай простую формулу типа (мкр+вольты) взять от этого 1 байт.
т.е. тебе нужна будет простая проверка:
if (crc==((doza+volt) & 0xff))
Это в разы понизит вероятность ошибки.
Пакет будет выглядеть так:
E9 xx yy E5 zz vv qq A4
xx - доза старший байт
yy - доза младший байт
zz - напряжение старший байт
vv - напряжение младший байт
qq - контрольная сумма
Код: Выделить всё
По алгоритму обработки предлагаю так, есть буффер buff[]:
** ** ** ** ** E9 xx yy E5 zz vv qq A4 ** ** ** ** **
Упращенно и утрированно на сях
В цикле идем по нему до тех пор пока элемент buff[i] не будет равен E9, затем
possible_tru=0;
doz_hi=buff[i+1];
doz_lo=buff[i+2];
if(buff[i+3]==0xE5)
{ volt_hi=buff[i+4];
volt_lo=buff[i+6];
crc=buff[i+7];
if(buff[i+8]==0xA4) possible_tru++;
if(crc==((doza+volt) & 0xff))possible_tru++;
} else {
версия без напряжения
}
Если possible_tru = 2 - то пакет абсолютно доставерный и версия с передачей
Если possible_tru = 1 - то версия с передачей вероятность достоверности маленькая, вероятно не версия 17
Если хотябы 1 раз был получен пакет с possible_tru = 2, то более никогда не принимать пакеты с доставерностью ниже 2, т.к.прошивка точно гамма 17
ну а далее
q=doz_hi;
q=(q<<8+doz_lo);
итд
Да и еще, применять там кейсы не в тему, т.к. там четкое следование битов 1 за 1.
а то получится:
E9 xx yy ** ** ** ** ** ** ** E5 ** ** **
Где ** и E5 - мусор, а МК неподдерживает передачу напряжения
Дозиметр мало отличается от девушки, он нежный, любит чистоту, и хорошо себя чувствует только под обильным слоем лака.