CRC8嵌入式实现

CRC8嵌入式实现,c,embedded,crc,C,Embedded,Crc,我试图为pic微控制器编写一个CRC8校验和的实现。我的算法是基于一个我已经测试过并正在运行的算法 唯一的区别是我让我的CRC8函数将uint16_t作为输入并返回uint8_t作为输出,而不是二进制ascii值。我已经尽我所能复制了他们的代码,但它似乎没有让我获得与他们的代码相同的值 #include <stdio.h> #include <stdint.h> uint8_t crc8(uint16_t input); int main() { uint8_

我试图为pic微控制器编写一个CRC8校验和的实现。我的算法是基于一个我已经测试过并正在运行的算法

唯一的区别是我让我的CRC8函数将uint16_t作为输入并返回uint8_t作为输出,而不是二进制ascii值。我已经尽我所能复制了他们的代码,但它似乎没有让我获得与他们的代码相同的值

#include <stdio.h>
#include <stdint.h>

uint8_t crc8(uint16_t input);

int main()
{
    uint8_t temp1;
    uint16_t temp2 = 0xAA79;

    printf("CRC input is 0x%X\n", temp2);

    temp1 = crc8(temp2);

    printf("CRC output is 0x%X\n", temp1);

    return 0;
}

uint8_t crc8(uint16_t input)
{
    uint8_t crc[8] = { 0 };
    uint8_t i;
    uint8_t inv;
    uint8_t output = 0;

    for(i = 0; i < 16; i++)
    {
        inv = ((((input >> i) & 1) ^ crc[7]) & 1);

        crc[7] = (crc[6] & 1);
        crc[6] = (crc[5] & 1);
        crc[5] = (crc[4] ^ inv & 1);
        crc[4] = (crc[3] ^ inv & 1);
        crc[3] = (crc[2] & 1);
        crc[2] = (crc[1] & 1);
        crc[1] = (crc[0] & 1);
        crc[0] = (inv & 1);
    }

    for(i = 0; i < 8; i++)
    {
        output |= ((crc[i] << i) & (1 << i));
    }


    return output;
}
#包括
#包括
uint8\u t crc8(uint16\u t输入);
int main()
{
uint8_t temp1;
uint16_t temp2=0xAA79;
printf(“CRC输入是0x%X\n”,temp2);
temp1=crc8(temp2);
printf(“CRC输出为0x%X\n”,temp1);
返回0;
}
uint8\u t crc8(uint16\u t输入)
{
uint8_t crc[8]={0};
uint8_t i;
uint8_t inv;
uint8_t输出=0;
对于(i=0;i<16;i++)
{
inv=(((输入>>i)和1)^crc[7])&1);
crc[7]=(crc[6]&1);
crc[6]=(crc[5]&1);
crc[5]=(crc[4]^inv&1);
crc[4]=(crc[3]^inv&1);
crc[3]=(crc[2]&1);
crc[2]=(crc[1]&1);
crc[1]=(crc[0]&1);
crc[0]=(库存和1);
}
对于(i=0;i<8;i++)
{

输出|=((crc[i]您的程序确实有效:但您的位序列错误。下面是链接的代码和您发布的代码。字符串
bs[]
temp2
具有相同的位序列,但失败。使用反向位字符串
sb[]
的第二次尝试与您的函数输出匹配

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>

uint8_t crc8(uint16_t input)
{
    uint8_t crc[8] = { 0 };
    uint8_t i;
    uint8_t inv;
    uint8_t output = 0;

    for(i = 0; i < 16; i++)
    {
        inv = ((((input >> i) & 1) ^ crc[7]) & 1);

        crc[7] = (crc[6] & 1);
        crc[6] = (crc[5] & 1);
        crc[5] = (crc[4] ^ inv & 1);
        crc[4] = (crc[3] ^ inv & 1);
        crc[3] = (crc[2] & 1);
        crc[2] = (crc[1] & 1);
        crc[1] = (crc[0] & 1);
        crc[0] = (inv & 1);
    }

    for(i = 0; i < 8; i++)
    {
        output |= ((crc[i] << i) & (1 << i));
    }

    return output;
}

char *MakeCRC(char *BitString)
{
    static char Res[9];                                 // CRC Result
    char CRC[8];
    int  i;
    char DoInvert;

    for (i=0; i<8; ++i)  CRC[i] = 0;                    // Init before calculation

    for (i=0; i<strlen(BitString); ++i)
        {
        DoInvert = ('1'==BitString[i]) ^ CRC[7];         // XOR required?

        CRC[7] = CRC[6];
        CRC[6] = CRC[5];
        CRC[5] = CRC[4] ^ DoInvert;
        CRC[4] = CRC[3] ^ DoInvert;
        CRC[3] = CRC[2];
        CRC[2] = CRC[1];
        CRC[1] = CRC[0];
        CRC[0] = DoInvert;
        }

    for (i=0; i<8; ++i)  Res[7-i] = CRC[i] ? '1' : '0'; // Convert binary to ASCII
    Res[8] = 0;                                         // Set string terminator

    return(Res);
}

int main()
    {
    uint8_t temp1;
    uint16_t temp2 = 0xAA79;
    char bs[] = "1010101001111001";
    char sb[] = "1001111001010101";
    printf("CRC input is 0x%X\n", temp2);
    temp1 = crc8(temp2);
    printf("CRC output is 0x%X\n", temp1);

    printf("Web ver output is %s\n", MakeCRC(bs));
    printf("Web rev output is %s\n", MakeCRC(sb));

    return 0;
}
CRC input is 0xAA79
CRC output is 0xAB
Web ver output is 01100001
Web rev output is 10101011