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

Posted 聚优致成

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于DSP学习--BCC校验(异或校验)的主要内容,如果未能解决你的问题,请参考以下文章

BCC校验(异或和校验)

重要网址小记

重要网址小记

Delphi 异或校验方法

c语言实现异或校验

串口常用校验算法(累加和异或和)