编辑代码

#include <stdio.h>

typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long ulong;
typedef unsigned char BYTE;

uint tool_calc_crc16(uchar *buf, uchar len)
{
	uchar i;
	uint crc = 0;

	while (len--)
	{
		for (i = 0x80; i != 0; i >>= 1)
		{
			if (crc & 0x8000)
			{
				crc <<= 1;
				crc ^= 0x1021;
			}
			else
			{
				crc <<= 1;
			}
			
			if ((*buf) & i)
			{
				crc ^= 0x1021;
			}
		}
		buf++;
	}
	
	return crc;
}

int main () {
    uint crc = 0;
    //FA A5 19 02 01 7A 00 FA 00 00 00 01 18 00 00 00 00 00 00 00 00 00 00 52 95
    uchar data_25_buf[25] = {0xFA,0xA5,0x19,0x02,0x01,0x00,0x00,
                             0x00,0x01,0x20,0x00,0x01,0x18,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x95};
    //FA A5 28 01 02 00 00 00 00 00 1F 1F 00 00 00 00 2A 30 00 00 00 60 00 00 1F 1F 00 00 00 00 2A 30 00 00 00 3C 0B 86 A6 27
    uchar data_40_buf[40] = {0xFA,0xA5,0x28,0x01,0x02,0x00,0x00,
                             0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x2A,0x30,0x00,0x00,0x00,
                             0x60,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x2A,0x30,0x00,0x00,0x00,0x3C,0x0B,0x86,0xA6,0x27};

    crc = tool_calc_crc16(data_25_buf, 23);
    data_25_buf[23] = (uchar)((crc >> 8) & 0xFF);
    data_25_buf[24] = (uchar)(crc & 0xFF);
    printf("data_25_buf:");
    for (int i = 0; i < 25; i++)
        printf("%02x ", data_25_buf[i]);
    printf("\r\n");

    crc = tool_calc_crc16(data_40_buf, 38);
    data_40_buf[38] = (uchar)((crc >> 8) & 0xFF);
    data_40_buf[39] = (uchar)(crc & 0xFF);
    printf("data_40_buf:");
    for (int i = 0; i < 40; i++)
        printf("%02x ", data_40_buf[i]);
    printf("\r\n");

    return 0;
}