crc16ibm.c 2.2 KB
#include "crc16ibm.h"
//#include "Hex_and_Dex.h"
#include "string.h"
//#include "dji_logger.h"

uint8_t Buff_Compare(uint8_t *buff_1,uint8_t* buff_2,uint8_t BuffSize)
{
	int i = 0;
	for(i=0;i<BuffSize;i++)
	{
		if(buff_1[i]!=buff_2[i])
			return 0 ;
	}
	return 1;
}

/*
功能:  crc16校验
参数:  要校验的数组地址,
	    传入的数组长度
返回值:16位的校验数据
*/
uint16_t crc16_ibm(uint8_t *ptr,uint16_t len)
{
		uint8_t i;
		uint16_t crc = 0x00;

		if (len == 0)
		{
				len = 1;
		}
		while(len--)
		{
			crc ^= *ptr;
			for(i = 0;i < 8;i++)
			{
				if (crc & 1)
				{
						crc >>= 1;
						crc ^= 0xA001;
				}
				else
				{
						crc >>= 1;
				}
			}
			ptr++;
		}
		return crc;
}

void u16_2_u8(uint16_t *data,uint8_t *a)
{
	   *a  = (*data) >> 8;
	*(a+1) = (*data) & 0xff;
}

uint8_t Frame_Check(uint8_t* frame)
{

	if(0x5A==*frame && 0x5A==*(frame+1) && 0x77==*(frame+2))		//帧头正确
	{
		if(0x00==*(frame+11)&&0x23==*(frame+12))		//校验位正确
			return 1;
	}
	return 0;
}

//判断帧头和帧尾
//5B 5B 76 00 13 6E 2D 3D 37 45 00 23
uint8_t Frame1_Check(uint8_t *checkBuf, uint32_t bufLength)
{
    if (bufLength < 12) // 检查缓冲区长度是否小于12
    {
        return 0;
    }
	 uint8_t CompareBuf[4][3] = {{0x5A, 0x5A, 0x77}, {0x5B, 0x5B, 0x77}, {0x6A, 0x6A, 0x77}, {0x6B, 0x6B, 0x77},};

	int i, j;
	for (i = 0; i < 3; i++) {
		int match = 1;
		for (j = 0; j < 3; j++) {
			if (checkBuf[j] == CompareBuf[i][j]) {
				match = 0;
				break;
			}
		}
		if(match) {
			return 0;
		}
	}
    
    // 判断长度位
   if (checkBuf[3] > 0xff || checkBuf[4] > 0xff) {
//	   printf("-----1-----\r\n");
		return 0;
	}

    
    // 判断应答位
    if (checkBuf[5] != 0x00 && checkBuf[5] != 0x01) {
//		printf("-----2-----\r\n");
        return 0;
    }
    
    // 判断应答位
    if (checkBuf[6] != 0x00) {
//		printf("-----3-----\r\n");
        return 0;
		
    }

    // 判断帧尾
    if (checkBuf[bufLength - 2] == 0x00 && checkBuf[bufLength - 1] == 0x23) {
        return 1;
    } else {
//		printf("-----4-----\r\n");
        return 0;
    }
}

//uint8_t Length(uint8_t* frame)
//{
//		*(frame+3)

//}

/*
功能:将u8数据转为u16数据
参数:u16数据的地址
	  u8数组的首地址

*/
//void u8_2_u16(uint16_t* data,uint8_t* b)
//{
//	*data = (*b)<<8;
//	*data |= *(b+1);
//}