一个CRC16算法

freedomfly911 2009-04-10 08:03:19
我的数据类似如下(只是比方,真实数据随机产生)。用BYTE buf[9]接收, 需要buf[5],buf[6]做CRC16效验,请问如何做。谢谢
0x 55 55 02 00 B4 D0 77 AA AA
0x 55 55 02 01 0E 50 54 AA AA
0x 55 55 02 01 69 11 BE AA AA
0x 55 55 02 01 6E 50 7C AA AA
0x 55 55 02 01 E0 D0 18 AA AA
0x 55 55 02 01 FB 90 13 AA AA
其他代码如下:
for(int i=0;i <len;i++)
{
BYTE buf[9];
memcpy(buf,abIn+i,9);
if( 0x55 == buf[ 0 ] && 0x55 == buf[ 1 ] )
{
flag = 0;
if(0xaa == buf[ 7 ] && 0xaa == buf[ 8 ])
{
//校检
flag++;
if (flag == 1)
{
//float Angel;
double dvalue = (double)((buf[3] * 0x100 + buf[4])/2.0);
m_meter.UpdateNeedle(dvalue);
memset(buf,0,9);
flag--;
}
。。。。。。
...全文
870 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
freedomfly911 2009-04-21
  • 打赏
  • 举报
回复
我知道这样改可以运行成功,但是我的建了个BYTE buf[9];其中buf[2]是我需要输入校检的数据。
可不可以这样,另设BYTE data[1] = buf[2],把data输入函数WORD CalculateCRC( data, 1);
信念 2009-04-21
  • 打赏
  • 举报
回复

WORD CalculateCRC( buf[2], 1);
//改成
WORD CalculateCRC( buf, 1);

多看点基础的书对你会有帮助
freedomfly911 2009-04-21
  • 打赏
  • 举报
回复
主函数:
BYTE buf[9];
WORD CalculateCRC( buf[2], 1);

求crc的算法:
WORD CalculateCRC( BYTE RecvDataBuf[], WORD RecvDataSize)
{
WORD iInitCrc = 0x0000; // CRC
WORD iIndex = 0x0000; // 数组下标
int iRow = 0;
int iCol = 0;
for( int i=0; i<RecvDataSize; i++)
{
iIndex = LOBYTE(iInitCrc) ^ (RecvDataBuf[i]&0xFF); // CRC地址
iRow = HIBYTE(iIndex);
iCol = LOBYTE(iIndex);
iInitCrc = (gCRCLow[iRow][iCol] ^ ( HIBYTE(iInitCrc)))&(0x00FF); // CRC低字节
iInitCrc = iInitCrc | (gCRCHight[iRow][iCol]<<8)&(0xFF00);
}
return iInitCrc;
}

系统报错,'CCommtestDlg::CalculateCRC' : cannot convert parameter 1 from 'BYTE' to 'BYTE []'
freedomfly911 2009-04-20
  • 打赏
  • 举报
回复
召唤达人中
信念 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 freedomfly911 的回复:]
求crc函数,WORD CalculateCRC( BYTE *RecvDataBuf, WORD RecvDataSize)
我需要传入buf[2],但是系统报错,'CCommtestDlg::CalculateCRC' : cannot convert parameter 1 from 'BYTE' to 'BYTE []'
怎么办?        谢谢

[/Quote]
动脑筋问好不好?都不把自己的代码贴出来
freedomfly911 2009-04-20
  • 打赏
  • 举报
回复
求crc函数,WORD CalculateCRC( BYTE *RecvDataBuf, WORD RecvDataSize)
我需要传入buf[2],但是系统报错,'CCommtestDlg::CalculateCRC' : cannot convert parameter 1 from 'BYTE' to 'BYTE []'
怎么办? 谢谢
freedomfly911 2009-04-20
  • 打赏
  • 举报
回复
请教一下,得到crc后要干什么,和报文中的crc对比还是其他?
信念 2009-04-20
  • 打赏
  • 举报
回复
提供的资料只供参考,具体解决还是靠自己吧,
我也好久不用,忘得差不多了
freedomfly911 2009-04-19
  • 打赏
  • 举报
回复
求高手指教啊
freedomfly911 2009-04-17
  • 打赏
  • 举报
回复
谢谢,我的数据是byte[]型是不是将这句 “unsigned short CRC_16( unsigned char * aData, unsigned long aSize )”
改成 unsigned short CRC_16( unsigned byte* aData, unsigned long aSize )

另外我对crc原理不是很了解,得到crc后怎么做,和报文中的crc对比?

谢谢赐教,不胜感激!


信念 2009-04-17
  • 打赏
  • 举报
回复

unsigned short crc=CRC_16(SendData,cc);//cc是SendData的长度
信念 2009-04-17
  • 打赏
  • 举报
回复

const unsigned short cnCRC_16=0x8005; // CRC-16=X16+X15+X2+X0
unsigned long Table_CRC[256]; // CRC 表

// 构造 16 位 CRC 表
void BuildTable16( unsigned short aPoly )
{
unsigned short i, j;
unsigned short nData;
unsigned short nAccum;
for(i=0;i<256;i++ )
{
nData=(unsigned short)(i<< 8 );
nAccum = 0;
for(j=0;j<8;j++ )
{
if ((nData ^ nAccum) & 0x8000 )
nAccum=(nAccum<<1) ^ aPoly;
else
nAccum<<=1;
nData<<=1;
}
Table_CRC[i]=(unsigned long)nAccum;
}
}

// 计算 16 位 CRC 值,CRC-16 或 CRC-CCITT
unsigned short CRC_16( unsigned char * aData, unsigned long aSize )
{
unsigned long i;
unsigned short nAccum=0;
BuildTable16(cnCRC_16); // or cnCRC_CCITT
for(i=0;i<aSize;i++)
nAccum=(nAccum<<8) ^ (unsigned short)Table_CRC[(nAccum>>8) ^ *aData++];
return nAccum;
}

char SendData[];//你要校验的数据
unsigned short crc=CRC_16(SendData,cc);

//crc就是你要的校验码,以前用过的代码,你可以自己整理一下看看
freedomfly911 2009-04-17
  • 打赏
  • 举报
回复
求达人指教!
freedomfly911 2009-04-16
  • 打赏
  • 举报
回复
抱歉,写的不清楚,问题是这样的。

名称 占用字节数目 备注
帧头 2 取值:0x5555
长度码 1
方位码 2
CRC码 2 将“长度码”和“方位码”的内容作CRC-16效验
帧尾 2 取值:0xAAAA

例:
0x 55 55 02 00 B4 D0 77 AA AA
0x 55 55 02 01 0E 50 54 AA AA
0x 55 55 02 01 69 11 BE AA AA
0x 55 55 02 01 6E 50 7C AA AA
0x 55 55 02 01 E0 D0 18 AA AA
0x 55 55 02 01 FB 90 13 AA AA

设一个byte buf[9]接收数据,请问这个crc16校检怎么做?
其他代码如下:
for(int i=0;i <len;i++)
{
BYTE buf[9];
memcpy(buf,abIn+i,9);
if( 0x55 == buf[ 0 ] && 0x55 == buf[ 1 ] )
{
flag = 0;
if(0xaa == buf[ 7 ] && 0xaa == buf[ 8 ])
{
//crc-16校检
flag++;
。。。。。。
不胜感激!
mengde007 2009-04-11
  • 打赏
  • 举报
回复
网上很多的,最好找rfc协议看看
unsigned short CRC16(puchMsg, usDataLen)

unsigned char *puchMsg ; /* 要进行CRC校验的消息 */

unsigned short usDataLen ; /* 消息中字节数 */

{

unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */

unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */

unsigned uIndex ; /* CRC循环中的索引 */

while (usDataLen--) /* 传输消息缓冲区 */

{

uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */

uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;

uchCRCLo = auchCRCLo[uIndex] ;

}

return (uchCRCHi << 8 | uchCRCLo) ;

}

 

/* CRC 高位字节值表 */

static unsigned char auchCRCHi[] = {

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40

} ;

/* CRC低位字节值表*/

static char auchCRCLo[] = {

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,

0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,

0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,

0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,

0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,

0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,

0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,

0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,

0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,

0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,

0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,

0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,

0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,

0x43, 0x83, 0x41, 0x81, 0x80, 0x40

} ;

参考一下,具体的百度上面有

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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