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

📄 fifo.h

📁 cFIFO:FIFO控制类
💻 H
字号:
/**************************************************************************************/
// FIFO控制类,面向运行效率优化
// 适合PPC,单片机编程
// 包含CRC校验,成帧控制
// sr2007w@gmail.com
/**************************************************************************************/

#ifndef _FIFO_H_
#define _FIFO_H_
//#pragma once

#define MAX_LEN 1024

#define FIFO_FRAME_INSERT_7F

#define READ_BY_LENGTH					0
#define READ_ENDFLAG_NO_CRC				1
#define READ_ENDFLAG_WITH_CRC			2

#define WRITE_BY_LENGTH					0
#define WRITE_NOT_COMPLETE_FRAME		1
#define WRITE_ENDFLAG_WITH_CRC			2

#define CRC_TYPE_8_BIT					0
#define CRC_TYPE_16_BIT					1
#define CRC_TYPE_CCITT					2

class CFifo
{
public:
	DWORD wFrameNum;			// Frame Number in FIFO
	HANDLE hEventRead;			// Event: to Read
	HANDLE hEventWrite;			// Event: to Write
	BOOL ReadFlagEnable;
	BOOL WriteFlagEnable;

private:
	CRITICAL_SECTION FIFO_operation;

	DWORD nPtr_W;
	DWORD nPtr_W_inFrame;
	DWORD nPtr_R;
	char *FIFO_Base;		// FIFO Base Address;
	DWORD FIFO_Len;			// FIFO length (byte)
	char cEndFlag;			// End Flag: 0x7E(End Flag excluded in frame), 0xA, 0xD, etc.
							// (EndFlag = 0x7E): Frame can contain any character(include End Flag) and FCS(CRC) appended
	char CRC_Type;			// 0: CRC-8; 1: CRC-16; 2: CRC-CCITT
	DWORD wFrmNumToRead;	// if wFrameNum >= wFrmNumToRead; Set hEventRead.
	DWORD wFrmNumToWrite;	// if wFrameNum <= wFrmNumToWrite; Set hEventWrite.
	BYTE FIFO_WriteMode;	// 0: constant length or complete frame; 1: Not complete frame & No CRC; 2: EndFlag(0x7E), CRC;
	BYTE FIFO_ReadMode;		// 0: constant length; 1: EndFlag(Not 0x7E), No CRC; 2: EndFlag(0x7E), CRC;
	char BufTempIn[MAX_LEN];
	char BufTempOut[MAX_LEN];

public:
	CFifo(void);
	~CFifo(void);

	DWORD WriteFIFO(char *BufIn, DWORD Len);		// Return: Bytes written.(0 -- FIFO Full or Fail);
													// Len: Data Length
	DWORD ReadFIFO(char *BufOut, DWORD Len);		// Return: Frame length.(0 -- FIFO empty or Fail); 
													// Len: 0 -- variable length & End Flag; 
													// Other: constant length & No End Flag.
	BOOL ResetFIFO(	char *BaseFIFO, 
					DWORD LenFIFO, 
					char EndFlag, 
					char TypeCRC, 
					DWORD ReadFlag, 
					DWORD WriteFlag, 
					BYTE ReadModeFIFO, 
					BYTE WriteModeFIFO
					);
	void EmptyFIFO();
	DWORD GetRoomLeft();

private:
	DWORD PutDataIntoFIFO(char *BufIn, DWORD Len);
	DWORD PartialDataIntoFIFO(char *BufIn, DWORD Len, DWORD &FrmNum);
	DWORD GetDataFromFIFO(char *BufOut, DWORD Len);
	DWORD GetDataFromFIFO(char *BufOut);
	DWORD GetCRC(char *BufIn, DWORD Len);
	DWORD FrameConstructor(char *BufIn, DWORD Len);			// Return: contain FCS & END_FLAG
	DWORD FrameExtractor(char *BufOut, DWORD Len);			// Len: contain FCS & END_FLAG
};

#endif

⌨️ 快捷键说明

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