Ну вот и я добрался до этих CRC... Подскажите мне вот что - если в моем приложении пакеты не особо длинные (5-40 байт), можно ли заменить подсчет CRC16 менее сложным алгоритмом обнаружения ошибок? Например, банальным xor, как в NMEA протоколе, или xor с прокруткой? Протокол обмена у меня будет самописный, т.е., в принципе - че хочу то ворочу, линия связи - короткая, наличие помех->0, скорость обмена небольшая. Понятно, что CRC не дураки придумали, но все же насколько оправдано применение CRC16 в моих условиях? Очень уж мне не хочется считать CRC16 в контроллере, да еще и таблично - 512 байт на массив в двухкилобайтном МК - весьма ощутимо.
uint16_t crc16_update(uint16_t crc, uint8_t a)
{
int i;
crc ^= a;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}
return crc;
}
//-----------------------------------------------------------
это не больно - вот например, вычисление црц 16 с полиномом а001 для очередного байта в функцию передаете старое значение црц и байт данных, возвращаете новое значение црс.
