我应该向crc16方法提供什么输入

我应该向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

这是我的Mod bus crc_16嵌入式代码。我已经多次在代码块中运行此代码。没有错误,但我没有得到实际的crc值。我应该得到crc 05C8,我现在得到8512

我认为调用CRC方法时输入错误。我正在传递绳子和它的长度。所以请帮帮我

    #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;
   }


 `