[an error occurred while processing this directive]
И еще...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Amateur 27 января 2003 г. 19:50
В ответ на: Не сочтите за наглость. Кто работал с CRC16, если можно реально работающую функцию формирования суммы. Да так, чтобы без таблиц и на С. Спасибо. отправлено allmaker 27 января 2003 г. 12:43

void crc16_XModem(unsigned char data, unsigned short & crc)
{
//X**16+Х**12+Х**5+1
register unsigned char a;
a = (unsigned char)(data ^ crc);
a ^= (unsigned short)(a<<4);
crc=(unsigned short)((crc>>8)^(a<<8)^(a<<3)^(a>>4));
}
//------------------------------------------------------------------------
void crc16_ccitt(unsigned char data, unsigned short & crc)
{
//X**16+Х**12+Х**5+1
unsigned char a;
a = (unsigned char)((crc>>8 )^ data);
a ^= (unsigned char)(a>>4);
crc = (unsigned short)((crc<<8) ^ a ^ (a<<5) ^ (a<<12));

}
//------------------------------------------------------------------------
void crc10_Sample(unsigned char data, unsigned short & crc)
{
// x^10 + x^9 + x^5 + x^4 + x + 1 = 1 10 0011 0011

register unsigned short a=0x233, d = crc, i;
d ^= (unsigned short)(data<<1);
for (i=0; i<8; i++)
if ((d <<= 1) & 0x400) d ^= a;
crc = (unsigned short)(d & 0x3ff);
}
//---------------------------------------------------------------------------
void crc10_Sample1(unsigned char data, unsigned short & crc)
{
// x^10 + x^9 + x^5 + x^4 + x + 1 = 1 10 0011 0011
register unsigned short a;
a = (unsigned short)(crc>>2);
a ^= ((a>>1)^(a>>2)^(a>>3)^(a>>4));
crc = (unsigned short)(((crc<<8)^ data) & 0x3FF);
crc ^= (unsigned short)a;
crc ^= (unsigned short)(a<<1);
crc ^= (unsigned short)(a<<4);
crc ^= (unsigned short)(a<<5);
crc ^= (unsigned short)(a<<9);
crc &= 0x3FF;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru