Какой вклад я должен дать в метод crc16

Это мой мод шины, встроенный код 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;
       }

2 ответа

Ошибка в том, что в исходном коде вы использовали frame[2]=0x00; с последующим strlen(), который будет интерпретировать это как нулевой терминатор и даст неправильный размер 2 вместо 6. Вы не можете использовать strlen() на двоичных данных.

В "фиксированной" версии вы жестко кодируете размер до 6, чтобы ошибка была удалена случайно. Это не имеет ничего общего с uint8_t против char (хотя всегда лучше использовать uint8_t для двоичных данных).

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


 `
Другие вопросы по тегам