Как вычислять контрольную сумму - CRC8 CRC16 ?
Re: Как вычислять контрольную сумму - CRC8 CRC16 ?
Ну вот и я добрался до этих CRC... Подскажите мне вот что - если в моем приложении пакеты не особо длинные (5-40 байт), можно ли заменить подсчет CRC16 менее сложным алгоритмом обнаружения ошибок? Например, банальным xor, как в NMEA протоколе, или xor с прокруткой? Протокол обмена у меня будет самописный, т.е., в принципе - че хочу то ворочу, линия связи - короткая, наличие помех->0, скорость обмена небольшая. Понятно, что CRC не дураки придумали, но все же насколько оправдано применение CRC16 в моих условиях? Очень уж мне не хочется считать CRC16 в контроллере, да еще и таблично - 512 байт на массив в двухкилобайтном МК - весьма ощутимо.
- Реклама
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Как вычислять контрольную сумму - CRC8 CRC16 ?
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 для очередного байта в функцию передаете старое значение црц и байт данных, возвращаете новое значение црс.
{
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 для очередного байта в функцию передаете старое значение црц и байт данных, возвращаете новое значение црс.
Re: Как вычислять контрольную сумму - CRC8 CRC16 ?
urry, попробую, надо прикинуть времязатраты, если будет значительно меньше времени передачи пакета - так и сделаю. Кстати, за основу я взял modbus протокол, там именно такой полином и применяется.
