串行通信中,用VC++如何编写CRC校验码?

rain_sh 2001-12-27 06:47:39
我用串口实现无线通信,想在发送的数据中加上CRC校验码,如何编写呀?谁来帮我?我先谢了。
...全文
248 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rain_sh 2001-12-27
  • 打赏
  • 举报
回复
谢谢你,风滚草!我是第一次来这,这么快你就给了我帮助,真是非常感谢!新年快到了,祝你新年快乐、吉祥!
leafinwind 2001-12-27
  • 打赏
  • 举报
回复
这是32位的
CRC-32的生成多项式是

G(D)=D32+D26+D23+D22+D16+D12+D11+D10+D8+D7+D5+ D4+D2+D+1

由此求出生成矩阵

另外顺便给出其他几个常用CRC的生成多项式

CRC-CCITT: G(D)=D16+D12+D5+1

CRC-16: G(D)=D16+D15+D2+1

CRC-12: G(D)=D12+D11+D3+D2+D+1

(数字在右上角)

这里还有一个CRC-16的程序供参考

//CRC-16 Bit

//--------------------------------------------------------------------------

//--------------------------------------------------------------------------

//Written by Dmitry S. Obukhov, 1996

//obukhov@luckynet.co.il

//--------------------------------------------------------------------------

//Last modified 6 Apr 97

//--------------------------------------------------------------------------



//Add. key FAST_CPU - for CRC table calulation instead of using constants

//Non-ANSI keywords are C51 specific.

// xdata - variable in external memory

// code - constant in code memory (ROM)

//If your compiler doesn't support it make #define xdata YOUR_KEYWORD

//--------------------------------------------------------------------------



#ifdef __BORLANDC__

#define xdata /**/

#define code /**/

#endif

typedef union

{

unsigned int word;

struct

{

unsigned char lo;

unsigned char hi;

}byte;

} LO_HI;

#ifdef FAST_CPU

// Calculate the CRC value for index position i.

unsigned int crc_table(unsigned char i)

{

unsigned int j;

unsigned int k;

unsigned int crc;

k = i << 8;

crc = 0;

for( j = 0; j < 8; j++ )

{

if( ( crc ^ k ) & 0x8000) crc = (crc << 1) ^ 0x1021;

else crc <<= 1;

k <<= 1;

}

return crc;

}

#else

//This table generated by function crc_table(char)

static unsigned int code CRC_TABLE[256] =

{

0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,

0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,

0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,

0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,

0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,

0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,

0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,

0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,

0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,

0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,

0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,

0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,

0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,

0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,

0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,

0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,

0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,

0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,

0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,

0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,

0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,

0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,

0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,

0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,

0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,

0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,

0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,

0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,

0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,

0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,

0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,

0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0

};

#endif

static unsigned int crc_iterate(LO_HI crc, unsigned char d)

{

LO_HI temp;

#ifdef FAST_CPU

temp.word = crc_table(crc.byte.hi);

#else

temp.word = CRC_TABLE[crc.byte.hi];

#endif

crc.byte.hi = temp.byte.hi ^ crc.byte.lo;

crc.byte.lo = temp.byte.lo ^ d;

return crc.word;

}

//This is an entry point for external calls

//Define this function in the header file

unsigned int count_crc(unsigned char xdata * ptr,

unsigned int count)

{

LO_HI crc,temp;

unsigned int xdata i;

crc.word = 0;

temp.word = 0;

for (i=0;i<count;i++)

{

temp.word = CRC_TABLE[crc.byte.hi];

crc.byte.hi = temp.byte.hi ^ crc.byte.lo;

crc.byte.lo = temp.byte.lo ^ ptr[i];

}

return crc.word;

}

//END OF MODULE


16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧