#include <stdio.h>隊列
#define INS_HEADER1 0x55 //標準幀頭1
#define INS_HEADER2 0xAA //標準幀頭2io
//規定了數據幀當中的固定成員,其他數據成員由單元實現的功能決定
//這裏的公用的數據成員必須添加
typedef struct INS_HEAD
{
char head1; //幀頭1,0x55
char head2; //幀頭2,0xAA
}HEAD;數據類型
//數據類型枚舉
typedef enum INS_DATA_TYPE
{
TYPE_CMD = 0x00, //命令幀
TYPE_MESS = 0x01, //數據幀
TYPE_INFO = 0x02, //信息幀
TYPE_REP = 0x03, //報告幀
}DATA_TYPE;gc
//單元類型,指明信息幀對應的任務單元
typedef enum INS_UNIT_TYPE
{
PC_UNIT = 0x00, //PC單元,指明命令幀是PC下發的
TIME_UNIT = 0x01, //時間單元
/*
其餘單元根據新功能添加
*/
}UNIT_TYPE;程序
//指明數據方向(應用程序到底層或者底層到應用程序)
typedef enum INS_DST_TYPE
{
MESS_TO_LOWER = 0x01,
MESS_TO_PC = 0x01,
}DST_TYPE;數據
//信息幀錯誤類型
typedef enum INS_DATA_ERR_TYPE
{
INS_MSG_OK = 0x00,
INS_HEAD_ERR = 0x01,
INS_CMD_ERR = 0x02, //命令錯誤(非命令幀)
INS_CRC_ERR = 0x03, //數據錯誤(包含數據長度以及校驗錯誤等)
}ERR_TYPE;di
//系統錯誤類型
typedef enum INS_SYSTEM_ERR_TYPE
{
TASK_ERR = 0x00, //任務錯誤
QUEUE_ERR = 0x01, //隊列錯誤
SEMAPHORE_ERR = 0x02, //信號量錯誤
}SYSTEM_ERR_TYPE;時間
//標準的信息頭(包括兩個幀頭、幀長度、幀類型),任何信息幀頭須要包含這些信息
typedef struct INS_MESSAGE_HEAD_STR
{
HEAD Head;
char Dat_Len;
DATA_TYPE DataType;
}MESSAGE_HEAD_STR;錯誤
typedef enum INS_CRC_TYPE
{
CRC_ERR = 0x00,
CRC_OK = 0x01,
}CRC_TYPE;枚舉
CRC_TYPE Cal_CRC(MESSAGE_HEAD_STR *insMsg)
{
char CRC_RST = 0;
char *pS, *crc;
pS = &insMsg->Dat_Len + 1;//從表示數據幀長度的寫一個元素開始計算校驗和
crc = pS + insMsg->Dat_Len;
for(; pS < crc; pS++)
{
CRC_RST += *pS;
}
if(CRC_RST == *crc)
return CRC_OK;
return CRC_ERR;
}
int main(int argc, char *argv[]){ char rst = 10; rst = Cal_CRC((MESSAGE_HEAD_STR *)array); printf("rst = %d\n", rst); return 0;}