DSP学习--BCC校验(异或校验)

检验值(LRC) Data 部分数据各字节异或值。
参看:BCC校验(异或校验)在线计算


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

static void strToHex(char* pbDest, char* pbSrc, int nLen, int* frameLen)
{
	uint32_t tmpLen = 0;
	char h1, h2;
	char s1, s2;
	char tmppbSrc[65535] = { 0 };
	for (int j = 0; j < nLen; j++)
	{
		if (pbSrc[j] != '\0')
		{
			if (pbSrc[j] != ' ')
			{
				tmppbSrc[tmpLen] = pbSrc[j];
				tmpLen++;
			}
			if (pbSrc[j] == '\n')
			{
				pbSrc[j] = '\0';
			}
		}
		else
		{
			break;
		}
	}
	*frameLen = tmpLen / 2;
	for (uint32_t i = 0; i < tmpLen / 2; i++)
	{
		h1 = tmppbSrc[2 * i];
		h2 = tmppbSrc[2 * i + 1];
		s1 = toupper(h1) - 0x30;
		if (s1 > 9)
		{
			s1 -= 7;
		}
		s2 = toupper(h2) - 0x30;
		if (s2 > 9)
		{
			s2 -= 7;
		}
		pbDest[i] = s1 * 16 + s2;
	}
}

static void check_bit(uint8_t* Databuf, uint32_t frameLen, uint8_t* CheckBit)
{
	uint8_t data_check = 0, cfgTail = 0;
	//uint32_t len = 0;
	//memcpy(&len, &Databuf[4], 1);
	//if ((len - 1) == frameLen)
	//{
		for (uint32_t i = 0; i < frameLen; i++)
		{
			cfgTail = cfgTail ^ Databuf[i];
		}
		data_check = cfgTail;
		printf("校验码为: %02X\n", data_check);
		sprintf(CheckBit, "%c%02X", ' ', data_check);
		printf("\n\n\n[带校验码数据已保存到 CRC.txt]\n");
	//}
	//else
	//{
	//	printf("[ERROR: Data Len is incorrect!!]\n");
	//	getchar();
	//}
}

static int Get_check_bit(void)
{
	char CRCData[65536] = { 0 };
	char CRCData1[65536] = { 0 };
	char CheckBit[20] = { 0 };
	FILE* file = NULL;
	file = fopen ("CRC.txt", "a+");
	if (NULL == file)
	{
		printf("file open fault!\n");
		return -1;
	}
	if (fgets(CRCData, 65536, file) != NULL)
	{
		if (fgets(CRCData1, 65536, file) != NULL)
		{
			if (strcmp(CRCData1, "\n") == 0)
			{
				printf("[ERROR: 需要校准的数据,换行太多了!]\n");
				getchar();
			}
			if (strcmp(CRCData1, "Check Out Data:\n") == 0)
			{
				printf("[ERROR: 数据已经校准了!]\n");
				getchar();
			}
		}
		int frameLen = 0;
		char buf[65535] = { 0 };
		strToHex(buf, CRCData, sizeof(buf), &frameLen);
		check_bit(buf, frameLen, CheckBit);
		CRCData[frameLen * 3 - 1] = '\0';
	}
	strcat(CRCData, CheckBit);
	fputs("\nCheck Out Data:\n", file);
	fputs(CRCData, file);
	fclose(file);
	return 0;
}

int main(int argc, char* argv[])
{
	printf("[注意: CRC.txt 文件内不能包含校验码]\n\n\n");
	Get_check_bit();
	getchar();
	return 0;
}

测试:

CRC.txt 内容:

30 01 03
Check Out Data:
30 01 03 32

在这里插入图片描述

相关推荐
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值