#include <stdio.h>
#define INS_HEADER1 0x55 //标准帧头1
#define INS_HEADER2 0xAA   	//标准帧头2
//规定了数据帧当中的固定成员,其余数据成员由单元实现的功能决定
//这里的公用的数据成员必须添加
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;
//单元类型,指明信息帧对应的任务单元
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;
//系统错误类型
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;
}
                    
                
                
            
        
浙公网安备 33010602011771号