威纶通官方论坛

宏指令CRC源码

[复制链接]
发表于 2012-8-16 13:58:43 | 显示全部楼层 |阅读模式
触摸屏与下位机通讯,自由通信协议的形式,下位机向触摸屏发送数据,触摸屏向下位机发送CRC校验码,下位机也有CRC校验代码,如果相同则进行数据传输。现在的问题是触摸屏通过宏指令CRC值和下位机CRC校验值不同,无法通讯。所以请教大家触摸屏的宏指令CRC校验的源码如何得到?知道宏指令CRC的源码后,我就可以在下位机编写相同的CRC校验算法了。急求宏指令CRC源码
发表于 2012-8-17 10:03:39 | 显示全部楼层
触摸屏 采用CRC_16码标准进行校验;
 楼主| 发表于 2012-8-17 10:36:49 | 显示全部楼层
回复 2# weinview

CRC16计算方法1:使用2个256长度的校验表
CRC16计算方法2:使用简单的校验表
CRC16计算方法3:使用直接结算的方法
通常在存储空间没有限制的情况下,采用方法1是最好的,毕竟在通讯中,保障通讯速度是至关重要的。而方法2占用空间很少。而与方法2相比,方法3似乎不占有什么优势。
现在一般采用方法1的较多,在weinview官网的下载中心--范例程序--D40与51单片机通讯实例中,我看到了一段CRC的代码,也就是采用了我上面说的算法1,如下:
uint crc16(uchar *puchMsg,uchar usDataLen) // puchMsg message to calculate CRC upon
{ // usDataLen quantity of bytes in message
uchar uchCRCHi = 0xFF ; // high byte of CRC initialized
uchar uchCRCLo = 0xFF ; // low byte of CRC initialized
uint uIndex ; // will index into CRC lookup table
while (usDataLen--) // Pass through message buffer
{
uIndex = uchCRCHi ^ *puchMsg++ ; // calculate the CRC
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (((uint)(uchCRCLo) << 8) | uchCRCHi) ;
}
其中最后的return语句是否正确,是否应该为return (((uint)(uchCRCHi) << 8) | uchCRCLo) ;
还有一个疑问,在触摸屏宏指令CRC中,你们的源码是采用的哪种算法1,2还是3?如果采用了方法1,那最后的return语句是什么?
发表于 2012-8-17 14:37:25 | 显示全部楼层
return (((uint)(uchCRCLo) << 8) | uchCRCHi) ;
此语句是正确的。
 楼主| 发表于 2012-8-17 17:36:54 | 显示全部楼层
回复 4# weinview
还有一个问题:
宏指令CRC只是针对8位数组的吗?还是16位的也可以直接使用?
假如我这里有short command[2]
                  short 16bit_CRC
                  command[0]=0x5501
                  command[1]=0xd357
我想求这两个数据的校验值,可以直接用CRC(command[0],16bit_CRC,2)吗?
 楼主| 发表于 2012-8-21 13:44:42 | 显示全部楼层
回复 4# weinview
经过验证,CRC是针对8位数据的
您需要登录后才可以发帖 登录 | 注册

本版积分规则

回复帖子

Archiver|小黑屋|威纶通官网 ( 粤ICP备06054553号 )

GMT+8, 2024-11-24 11:05

Powered by Discuz! X3.4

© 2001-2023 Comsenz Inc.

快速回复 返回顶部 返回列表