Проверка инвертированного байта контрольной суммы всегда ложна
Протокол передаёт байт и его инверсию для контроля. Пришло data = 0xF0, check = 0x0F, но пакет отбрасывается:
uint8_t data = 0xF0, check = 0x0F;
if (~data != check) {
return BAD_PACKET;
}
Почему условие истинно?
- data расширяется до int, ~ инвертирует 32 бита
- Оператор ~ для беззнаковых типов не определён
- Для инверсии байта нужен оператор !, а не ~
- Сравнение uint8_t с uint8_t идёт как char
