⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fifo.cpp

📁 cFIFO:FIFO控制类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		nPtr_R = 0;

	return Len_r;
}

DWORD CFifo::GetCRC(char *BufIn, DWORD Len)
{
	DWORD crc = 0;
	char crc8 = 0;
	WORD crc16 = 0;

	switch(CRC_Type)
	{
		case CRC_TYPE_8_BIT:
			while(Len--)
				crc8 = CRC_8_table[crc8 ^ *BufIn++];
			crc = (DWORD)crc8;
			break;
		case CRC_TYPE_16_BIT:
			while(Len--)
				crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufIn++];
			crc = (DWORD)crc16;
			break;
		case CRC_TYPE_CCITT:
			while(Len--)
				crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufIn++];
			crc = (DWORD)crc16;
			break;
		default:
			break;
	}

	return crc;
}

#define OPERATION_INSERT_7D(in, ptr, len)	\
	if (in == 0x7d || in == 0x7e){ 			\
		*ptr++ = 0x7d;						\
		*ptr++ = (in) ^ 0x20;				\
		len++;								\
	} else {								\
		*ptr++ = in;}

#define OPERATION_INSERT_7F(in, ptr, len)	\
	if (in > 0x7d){ 						\
		*ptr++ = 0x7f;						\
		*ptr++ = (in) ^ 0x20;				\
		len++;								\
	} else {								\
		*ptr++ = in;}

DWORD CFifo::FrameConstructor(char *BufIn, DWORD Len)
{
	char *ptr_temp = BufTempIn;
	DWORD Len_New = Len;
	char crc8 = 0;
	WORD crc16 = 0;

	switch(CRC_Type)
	{
		case CRC_TYPE_8_BIT:
			while(Len--)
			{
				#ifdef FIFO_FRAME_INSERT_7F
				OPERATION_INSERT_7F(*BufIn, ptr_temp, Len_New)
				#else
				OPERATION_INSERT_7D(*BufIn, ptr_temp, Len_New)
				#endif
				crc8 = CRC_8_table[crc8 ^ *BufIn++];
			}
			#ifdef FIFO_FRAME_INSERT_7F
			OPERATION_INSERT_7F(crc8, ptr_temp, Len_New)
			#else
			OPERATION_INSERT_7D(crc8, ptr_temp, Len_New)
			#endif
			*ptr_temp = 0x7e;			// End Flag
			Len_New += 2;
			break;
		case CRC_TYPE_16_BIT:
			while(Len--)
			{
				#ifdef FIFO_FRAME_INSERT_7F
				OPERATION_INSERT_7F(*BufIn, ptr_temp, Len_New)
				#else
				OPERATION_INSERT_7D(*BufIn, ptr_temp, Len_New)
				#endif
				crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufIn++];
			}
			#ifdef FIFO_FRAME_INSERT_7F
			OPERATION_INSERT_7F((char)crc16, ptr_temp, Len_New)
			OPERATION_INSERT_7F((char)(crc16 >> 8), ptr_temp, Len_New)
			#else
			OPERATION_INSERT_7D((char)crc16, ptr_temp, Len_New)
			OPERATION_INSERT_7D((char)(crc16 >> 8), ptr_temp, Len_New)
			#endif
			*ptr_temp = 0x7e;			// End Flag
			Len_New += 3;
			break;
		case CRC_TYPE_CCITT:
			while(Len--)
			{
				#ifdef FIFO_FRAME_INSERT_7F
				OPERATION_INSERT_7F(*BufIn, ptr_temp, Len_New)
				#else
				OPERATION_INSERT_7D(*BufIn, ptr_temp, Len_New)
				#endif
				crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufIn++];
			}
			#ifdef FIFO_FRAME_INSERT_7F
			OPERATION_INSERT_7F((char)crc16, ptr_temp, Len_New)
			OPERATION_INSERT_7F((char)(crc16 >> 8), ptr_temp, Len_New)
			#else
			OPERATION_INSERT_7D((char)crc16, ptr_temp, Len_New)
			OPERATION_INSERT_7D((char)(crc16 >> 8), ptr_temp, Len_New)
			#endif
			*ptr_temp = 0x7e;			// End Flag
			Len_New += 3;
			break;
		default:
			break;
	}

	return Len_New;
}

#define OPERATION_CLEAR_7D(out, ptr, len, len_new)		\
	if (0x7d == *ptr) {									\
		ptr++;											\
		out = *ptr++ ^ 0x20;							\
		len--;											\
		len_new--;										\
	} else {											\
		out = *ptr++;}

#define OPERATION_CLEAR_7F(out, ptr, len, len_new)		\
	if (0x7f == *ptr) {									\
		ptr++;											\
		out = *ptr++ ^ 0x20;							\
		len--;											\
		len_new--;										\
	} else {											\
		out = *ptr++;}

DWORD CFifo::FrameExtractor(char *BufOut, DWORD Len)
{
	char *ptr_temp = BufTempOut;
	DWORD Len_New = Len;
	char crc8 = 0;
	WORD crc16 = 0;
	char crc8_rec = 0;
	WORD crc16_rec = 0;

	switch(CRC_Type)
	{
		case CRC_TYPE_8_BIT:
			#ifdef FIFO_FRAME_INSERT_7F
			if (*(BufTempOut + Len - 3) == 0x7f)
			{
				crc8_rec = *(BufTempOut + Len - 2) ^ 0x20;
				while(Len-- > 3)
				{
					OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
					crc8 = CRC_8_table[crc8 ^ *BufOut++];
				}
				Len_New -= 3;
			}
			else
			{
				crc8_rec = *(BufTempOut + Len - 2);
				while(Len-- > 2)
				{
					OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
					crc8 = CRC_8_table[crc8 ^ *BufOut++];
				}
				Len_New -= 2;
			}
			#else
			if (*(BufTempOut + Len - 3) == 0x7d)
			{
				crc8_rec = *(BufTempOut + Len - 2) ^ 0x20;
				while(Len-- > 3)
				{
					OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
					crc8 = CRC_8_table[crc8 ^ *BufOut++];
				}
				Len_New -= 3;
			}
			else
			{
				crc8_rec = *(BufTempOut + Len - 2);
				while(Len-- > 2)
				{
					OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
					crc8 = CRC_8_table[crc8 ^ *BufOut++];
				}
				Len_New -= 2;
			}
			#endif

			if(crc8_rec != crc8)
				Len_New = 0;
			break;
		case CRC_TYPE_16_BIT:
			#ifdef FIFO_FRAME_INSERT_7F
			if (*(BufTempOut + Len - 3) == 0x7f)
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
				if (*(BufTempOut + Len - 5) == 0x7f)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
					while(Len-- > 5)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 5;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
			}
			else
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
				if (*(BufTempOut + Len - 4) == 0x7f)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
					while(Len-- > 3)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 3;
				}
			}
			#else
			if (*(BufTempOut + Len - 3) == 0x7d)
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
				if (*(BufTempOut + Len - 5) == 0x7d)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
					while(Len-- > 5)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 5;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
			}
			else
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
				if (*(BufTempOut + Len - 4) == 0x7d)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
					while(Len-- > 3)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 3;
				}
			}
			#endif

			if(crc16_rec != crc16)
				Len_New = 0;
			break;
		case CRC_TYPE_CCITT:
			#ifdef FIFO_FRAME_INSERT_7F
			if (*(BufTempOut + Len - 3) == 0x7f)
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
				if (*(BufTempOut + Len - 5) == 0x7f)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
					while(Len-- > 5)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 5;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
			}
			else
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
				if (*(BufTempOut + Len - 4) == 0x7f)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
					while(Len-- > 3)
					{
						OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 3;
				}
			}
			#else
			if (*(BufTempOut + Len - 3) == 0x7d)
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
				if (*(BufTempOut + Len - 5) == 0x7d)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
					while(Len-- > 5)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 5;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
			}
			else
			{
				crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
				if (*(BufTempOut + Len - 4) == 0x7d)
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
					while(Len-- > 4)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 4;
				}
				else
				{
					crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
					while(Len-- > 3)
					{
						OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
						crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
					}
					Len_New -= 3;
				}
			}
			#endif

			if(crc16_rec != crc16)
				Len_New = 0;
			break;
		default:
			break;
	}

	return Len_New;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -