我应该向crc16方法提供什么输入
这是我的Mod bus crc_16嵌入式代码。我已经多次在代码块中运行此代码。没有错误,但我没有得到实际的crc值。我应该得到crc 05C8,我现在得到8512 我认为调用CRC方法时输入错误。我正在传递绳子和它的长度。所以请帮帮我我应该向crc16方法提供什么输入,c,embedded,crc16,C,Embedded,Crc16,这是我的Mod bus crc_16嵌入式代码。我已经多次在代码块中运行此代码。没有错误,但我没有得到实际的crc值。我应该得到crc 05C8,我现在得到8512 我认为调用CRC方法时输入错误。我正在传递绳子和它的长度。所以请帮帮我 #include <stdio.h> #include <stdlib.h> #include <string.h> #define POLY 0x8005 unsigned int M
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define POLY 0x8005
unsigned int ModRTU_CRC(unsigned char * mod_data,unsigned int length)
{
unsigned int CRC16 = 0xFFFF;
unsigned int pos=0,i=0;
for(pos=0;pos<length;pos++)
{
CRC16 ^= (unsigned int) mod_data[pos];
for(i=0;i<8;i++)
{
if((CRC16 & 0x0001)!=0)
{
CRC16 >>=1;
CRC16^=0xA001;
}
else
{
CRC16 >>=1;
}
}
}
return CRC16;
}
int main()
{
//char *frame = "010600081388";
// char *frame = "010300080001";
char frame[7];
frame[0]=0x01;
frame[1]=0x03;
frame[2]=0x00;
frame[3]=0x08;
frame[4]=0x00;
frame[5]=0x01;
frame[6]='\0';
printf("%x\n",frame);
int len = strlen(frame);
unsigned int crcv = ModRTU_CRC(frame,len);
printf("%x\n",crcv);
return 0;
}
#包括
#包括
#包括
#定义多边形0x8005
无符号整数ModRTU_CRC(无符号字符*模数据,无符号整数长度)
{
无符号整数CRC16=0xFFFF;
无符号整数pos=0,i=0;
对于(位置=0;位置=1;
CRC16^=0xA001;
}
其他的
{
CRC16>>=1;
}
}
}
返回CRC16;
}
int main()
{
//char*frame=“010600081388”;
//char*frame=“01030008001”;
字符帧[7];
帧[0]=0x01;
帧[1]=0x03;
帧[2]=0x00;
帧[3]=0x08;
帧[4]=0x00;
帧[5]=0x01;
帧[6]='\0';
printf(“%x\n”,帧);
int len=strlen(帧);
无符号int-crcv=ModRTU_-CRC(帧,len);
printf(“%x\n”,crcv);
返回0;
}
#包括
#包括
#包括
#包括
#定义多边形0x8005
无符号整数ModRTU_CRC(无符号字符*模数据,无符号整数长度)
{
无符号整数CRC16=0xFFFF;
无符号整数pos=0,i=0;
对于(位置=0;位置=1;
CRC16^=0xA001;
}
其他的
{
CRC16>>=1;
}
}
}
返回CRC16;
}
int main()
{
uint8_t消息[80]={//6字节测试向量
0x01、0x03、0x00、0x08、0x00、0x01
};
int消息长度=6;
printf(“%x\n”,消息);
//int len=strlen(消息);
uint16_t_CRC=ModRTU_CRC(消息,消息长度);
printf(“%x\n”,CRC);
返回0;
}
`
错误在于,在原始代码中,您使用了帧[2]=0x00;
后跟strlen()
,这将解释为空终止符,并给出错误的大小2,而不是6。您不能对二进制数据使用strlen()
在“固定”版本中,您将大小硬编码为6,因此错误被意外删除。这与
uint8\u t
与char
无关(尽管二进制数据最好使用uint8\u t
。frame[6]='\0'
:哎哟:缓冲区溢出!您的缓冲区太短。在调用strlen
时可能会被覆盖,并因此获得不同的长度…此外,数组中的任何“字符”都不可打印,因此无法打印。此外,如果要将crcv
变量打印为十六进制,请使用%x
format。最后,我建议您花点时间阅读Eric Lippert的文章。@Shrikant我不知道“应该”或“不应该”是什么意思。此函数接受缓冲区及其长度,并以二进制形式计算缓冲区的CRC。如果您计算所读内容的CRC(接收的数据传输、文件读取等)然后,不需要任何额外的转换就按原样获取数据。将数据放入缓冲区,将其传递给函数。但是,如果您所拥有的只是01030008001;
,那么数据应该如何处理是非常不清楚的-作为二进制还是字符串。考虑到内容,我会假设为二进制,但这只是一个假设。您没有使用tCRC16-IBM多项式0x8005出现在代码中的任何位置,这让人感到可疑。当然0xA001是0x8005反转的,但是为什么要定义这个多项式呢?如果我没记错的话,我相信这个算法也应该在计算后反转数据缓冲区。你为什么把它作为一个答案发布?这是一个解决方案吗?它与问题?如果您想添加问题的详细信息,请编辑它。@Lundin是的,这是正确的答案。我已将数据类型从char
更改为uint8\u t
。不,这一点都不重要,只要您不使用大于0x7F的数字。现在我刚刚发现了实际的错误。我将发布一个答案。您是否将代码放在下面通过调试器,大约1分钟后您就会发现此错误。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define POLY 0x8005
unsigned int ModRTU_CRC(unsigned char * mod_data,unsigned int length)
{
unsigned int CRC16 = 0xFFFF;
unsigned int pos=0,i=0;
for(pos=0;pos<length;pos++)
{
CRC16 ^= (unsigned int) mod_data[pos];
for(i=0;i<8;i++)
{
if((CRC16 & 0x0001)!=0)
{
CRC16 >>=1;
CRC16^=0xA001;
}
else
{
CRC16 >>=1;
}
}
}
return CRC16;
}
int main()
{
uint8_t message[80] = { // 6-byte test vector
0x01, 0x03, 0x00, 0x08, 0x00, 0x01
};
int message_length = 6;
printf("%x\n",message);
// int len = strlen(message);
uint16_t the_CRC = ModRTU_CRC(message,message_length);
printf("%x\n",the_CRC);
return 0;
}
`