Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.04.2008, 09:46
|
|
Вид на жительство
Регистрация: 28.02.2008
Сообщений: 437
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Народ! Подскажите по алгоритму CRC16. Какой лучше выбрать
Чтобы было как можно меньше слепых пятен.
Пробовал инициализировать сдвиговый регистр $FFFF в начале и дописывать $FFFF в конце. Всё равно посчитав увидел что CRC16 не зависит от количества нулевых слов в "серёдке" пакета
|
|
|
|
03.04.2008, 11:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Код:
|
// CRC16 procedure
// *data - pointer to data
// quantity - data length
// *crc_calc - pointer to crc16 sum
void crc16(unsigned char *data, unsigned int *crc_calc, unsigned char quantity)
{
int i, index;
unsigned short C;
*crc_calc = 0;
for (index=1;index‹=quantity;index++,data++){
C=((*crc_calc››8)^*data)‹‹8;
for (i=0;i‹8;i++){
if (C&0x8000) C = (C‹‹1)^0x1021; полином
else C = C‹‹1;
}
*crc_calc = C^(*crc_calc‹‹8);
}
} |
|
|
|
|
03.04.2008, 11:04
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Можно к КС добавлять количество байт, если это так важно. Т.е. с очередным байтом (словом) добавляем к КС +1. Можно каждый байт (слово) XOR ить с какой нибудь константой и прибавлять. и т.д.
Удачи.
|
|
|
|
03.04.2008, 11:08
|
|
Вид на жительство
Регистрация: 28.02.2008
Сообщений: 437
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Вопрос в том, какой алгоритм подсчёта CRC16 и какие параметры этого алгоритма выбрать, чтобы не было "слепых" мест когда CRC не меняется при изменении размера области сплошных нулей или $FF в начале , середке или хвосте блока данных при неизменной длине этого блока данных
Приведу пример для CRC2Берём неприводимый полином 111
Попробуем сформировать CRC2 для 10.
Дописываем слева 11 получаем 1110. "Делим" по алгоритму CRC 1110 на 111 получам 0.
И сколько бы не было нулей в конце если начало блока равно 10 CRC2 всегда будет 0
Смысл такой: если в некотором блоке данных на некотором этапе CRC-деления на полином остаток стал равен нулю, то с этого момента можете пихать в блок сколько угодно нулей, CRC не измениться
Можно вместо нулей вставлять блоки, делящиеся на полином без остатка. CRC при этом тоже не измениться.
И мой вопрос: ка избавиться от этой неприятной фигни
|
|
|
|
20.06.2008, 08:43
|
|
Прописка
Регистрация: 10.06.2008
Сообщений: 115
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Смысл такой: если в некотором блоке данных на некотором этапе CRC-деления на полином остаток стал равен нулю, то с этого момента можете пихать в блок сколько угодно нулей, CRC не измениться
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:38.
|
|