请教modbus CRC16校验,如果输入负值怎么办

现在通讯代码如下:地址01,类型03,字节04,模拟量一个是'6’另一个是'-1'我使用的CRC16校验程序是如下:unsignedshortgetCRC16(unsig... 现在通讯代码如下:地址01 ,类型03 ,字节04 ,模拟量一个是 ' 6 ’ 另一个是 ' -1 '

我使用的CRC16校验程序是如下:

unsigned short getCRC16(unsigned int
*ptr,unsigned char len)
{
unsigned char i;
unsigned int
crc = 0xFFFF;
if(len==0) len = 1;
while(len--)
{

crc ^= *ptr++;
for(i=0; i<8; i++)
{

if(crc&1) { crc >>= 1; crc ^= 0xA001; }
else crc
>>= 1;
}
}
return(crc);

}
但得到的CRC16码是错的 unsigned int *ptr
如何改正,请各位高手指导
展开
 我来答
3147cqg
2013-08-13 · TA获得超过580个赞
知道小有建树答主
回答量:555
采纳率:37%
帮助的人:248万
展开全部
unsigned int *ptr 申明是无符号指针类型。

如果你CRC值是负,你用一个无符号类型去装它,就有可能出错。申明变量时去掉un就表示有符号数。试试吧。
追问
如果仅仅是改用无符号类型,就需要修改crc = 0xFFFF;  
和if(crc&1) { crc >>= 1; crc ^= 0xA001; }
else crc >>= 1;
这几处,不知道如何修改,才可以正常
追答
不用,你申明为有符号后结果是否正确?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lfc9861
2013-08-12 · TA获得超过291个赞
知道小有建树答主
回答量:472
采纳率:50%
帮助的人:282万
展开全部
带入后负的值内部就是按补码,取反加1后进行计算啊
更多追问追答
追问
我的补码程序如下
unsigned int get(int x )
{
int y ; y = x >> 15 ;
return ((x^y)-y)|(y<<15);
}
01 ,03 ,04 , ' 6 ’ ' -1 ' 

我是应该 01 03 04 get( 6 ) get( -1 ) 带入CRC校验
还是get( 01) get( 03) get( 04) get( 6 ) get( -1 ) 带入CRC校验
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-12
展开全部
无符号的,管那么多?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式