Какой вклад я должен дать в метод 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;
}
`