?? 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 + -