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

📄 time.c

📁 GPS时间处理
💻 C
字号:
/*******时间结构类型定义*********/
typedef struct  {
  WORD    wYear;  //年
  WORD    wMonth; //月
  WORD    wDay;   //日
  WORD    wHour;  //时
  WORD    wMinute;//分
  WORD    wSecond;//秒
}recDate;


void  vSysTimeCount(void)//累加器时钟
{
  WORD  wLastDay;
	
	if(++REC_CurSysTime.wSecond == 60)
	{
		REC_CurSysTime.wSecond = 0;
		if(++REC_CurSysTime.wMinute == 60)
		{
			REC_CurSysTime.wMinute = 0;
			if(++REC_CurSysTime.wHour == 24)
			{
				REC_CurSysTime.wHour = 0;
				
				wLastDay = wCptLastDay(REC_CurSysTime.wYear, REC_CurSysTime.wMonth);
				
				if(++REC_CurSysTime.wDay == wLastDay + 1)
				{
					REC_CurSysTime.wDay = 1;
					if(++REC_CurSysTime.wMonth == 13)
					{
						REC_CurSysTime.wMonth = 1;
						REC_CurSysTime.wYear++;
					}
				}
			}	
		}	
	}
}

 //GPS时间有效	REC_CurSysTime是全局变量,传递给prUTCDate
recDate *prUTCDate
	{
		pbCurrPtr = bArray[0];
		prUTCDate->wHour   = (pbCurrPtr[0] - 0x30) * 10 + pbCurrPtr[1] - 0x30;
		prUTCDate->wMinute = (pbCurrPtr[2] - 0x30) * 10 + pbCurrPtr[3] - 0x30;
		prUTCDate->wSecond = (pbCurrPtr[4] - 0x30) * 10 + pbCurrPtr[5] - 0x30;

		pbCurrPtr = bArray[8];
		prUTCDate->wDay   = (pbCurrPtr[0] - 0x30) * 10 + pbCurrPtr[1] - 0x30;
		prUTCDate->wMonth = (pbCurrPtr[2] - 0x30) * 10 + pbCurrPtr[3] - 0x30;
		prUTCDate->wYear  = (pbCurrPtr[4] - 0x30) * 10 + pbCurrPtr[5] - 0x30;
		prUTCDate->wYear += 2000;//加上2000年
	
		vUTCToPERKGTime(prUTCDate);//转换成北京时间
	}


//上发的时间数组
//时间的例子:FF B5 1D 04 02 07 D8 04 28 2A (4月2日2008<07D8>年12时40分42秒)
	bArrayTemp[bI++] = (BYTE)grSystemDate[0].wMonth;//月
	bArrayTemp[bI++] = (BYTE)grSystemDate[0].wDay;//日
	bArrayTemp[bI++] = ((BYTE *)(&grSystemDate[0].wYear))[0];//年
	bArrayTemp[bI++] = ((BYTE *)(&grSystemDate[0].wYear))[1];//年
	bArrayTemp[bI++] = (BYTE)grSystemDate[0].wHour;//时
	bArrayTemp[bI++] = (BYTE)grSystemDate[0].wMinute;//分
	bArrayTemp[bI++] = (BYTE)grSystemDate[0].wSecond;//秒
	
	
/******************************************************************************
**函 数 名  :     vUTCToPERKGTime
**功能简介  :     格林尼治时间转北京时间
******************************************************************************/
**全局变量  :     无
void  vUTCToPERKGTime(recDate  *prUTCTime)
{
  WORD wLastDay;
  
	prUTCTime->wHour += 8;
	if(prUTCTime->wHour >= 24)
	{
		prUTCTime->wHour -= 24;
		
		wLastDay = wCptLastDay(prUTCTime->wYear, prUTCTime->wMonth);//计算出本月最多的天数
		
		if(++prUTCTime->wDay == wLastDay + 1)
		{
			prUTCTime->wDay = 1;
					
			if(++prUTCTime->wMonth == 13)
			{
				prUTCTime->wMonth = 1;
				prUTCTime->wYear++;
			}
		} 
	}
}

WORD  wCptLastDay(WORD wYear, WORD wMonth)
{
	WORD wLastDay;
  	
	if(wMonth < 1 || wMonth > 12) wLastDay = 31;
	else if(wMonth == 2)
	{
		if((wYear % 100 != 0 && wYear % 4 == 0) || wYear % 400 == 0)//润年判断
		{
			wLastDay = 29;
		}
		else
		{
			wLastDay = 28;
		}
	}
	else if( (wMonth < 8 && wMonth % 2 == 1) || (wMonth >= 8 && wMonth % 2 == 0) )
	{
		wLastDay = 31;
	}
	else
	{
		wLastDay = 30;
	}
	
	return wLastDay;

}

typedef struct  {
	BYTE  *pbInQueue;	//进队列指针
	BYTE  *pbOutQueue;	//出队列指针
	BYTE  *pbQueue;		//指向队列缓冲的首地址
	WORD  wQueueLen;	//队列缓冲的长度,最大65535
}recSerial;

BYTE bPrtclAReadSerial(recSerial *prRecv,BYTE *pbPrtclAMsgFrame,BYTE *pbItem)
{
	BYTE bTemp;
	WORD wTempLen;

	vCloseInt(); //关闭中断
	if(prRecv->pbInQueue == prRecv->pbOutQueue)
	{
		vOpenInt(); //打开中断
		return NOT_OK;//消息队列中没有消息字节
	}
	vOpenInt(); //打开中断
	
	if( *pbItem < 3 )
    {
		bTemp = bReadSerialRecvQueue(prRecv);//读一字节
		if(*pbItem == 0 && bTemp == MacProtocolAHead)
        {
          pbPrtclAMsgFrame[(*pbItem)++] = bTemp;  //收到一条业务消息的开始
		  return NOT_OK;
        }
        else if(*pbItem > 0)//只有收到正确的消息头bItem才会大于0
        {
        	pbPrtclAMsgFrame[(*pbItem)++] = bTemp;  
        	return NOT_OK;
        }
        else return NOT_OK;  //没有收到一条业务消息的开始MacBusinessType,返回
    }
    
    else
    {
        if( (wTempLen=wGetQueueByteNum(prRecv)) < (WORD)(pbPrtclAMsgFrame[2]))return NOT_OK;//消息缓冲队列中还不够数据
        else
        {
            for(*pbItem=3;(*pbItem)<3+pbPrtclAMsgFrame[2] && (*pbItem)<MacProtocolAMaxLen;(*pbItem)++)
				pbPrtclAMsgFrame[*pbItem] = bReadSerialRecvQueue(prRecv);
			*pbItem = 0;          //一条消息接收完毕,复位*pbItem
            return  OK;
        }                	    
    }	
}

typedef struct {
	WORD StartPst;
	WORD EndPst;
	BYTE *QueueBuff;
	WORD QueueBuffLenth;
	BYTE MsgLen;
	BYTE MsgAdd;
	BYTE MsgCode;
	BYTE *MsgBuff;
}COM_QUEUE;

BYTE FilterMsg(COM_QUEUE *RecvQueue,BYTE *pbItem)
{
	BYTE bTemp;
	WORD RecvVms;
	static BYTE Rff=0;

	vCloseInt(); //关闭中断
	if(RecvQueue->EndPst == RecvQueue->StartPst)
	{
		vOpenInt(); //打开中断
		return 0;//消息队列中没有消息字节
	}
	vOpenInt(); //打开中断

	if( *pbItem < 3 )
    {
		bTemp = bReadSerialRecvQueue(RecvQueue);//读一字节
		if(*pbItem == 0 && bTemp == MacProtocolAHead)//消息头正确
        {
			RecvQueue->MsgBuff[(*pbItem)++] = bTemp;
			return 0;
        }
        else if(*pbItem > 0)//只有收到正确的消息头才会大于0
        {
        	RecvQueue->MsgBuff[(*pbItem)++] = bTemp;
			if(*pbItem == 1 && bTemp == 0xff){	//(重复的消息头)功能码错误,复位消息
				*pbItem = 0;
				if(bTemp == MacProtocolAHead) RecvQueue->MsgBuff[(*pbItem)++] = bTemp;
			}
			if(*pbItem == 2 && bTemp > 0xfd){	//消息头、功能码正确,长度非法,复位消息
				*pbItem = 0;
				if(bTemp == MacProtocolAHead) RecvQueue->MsgBuff[(*pbItem)++] = bTemp;
			}
			RecvQueue->MsgCode = RecvQueue->MsgBuff[1];
			RecvQueue->MsgLen  = RecvQueue->MsgBuff[2];  
			RecvQueue->MsgAdd = RecvQueue->MsgCode + RecvQueue->MsgLen;
			return 0;
        }
        else return 0;  //没有收到一条业务消息的开始MacBusinessType,返回
    }
	else
	{
		if(RecvQueue->MsgLen > RecvQueue->EndPst - RecvQueue->StartPst) return 0;//一条消息还未接收完成	
		for(*pbItem=3; (*pbItem) < RecvQueue->MsgLen+3; (*pbItem)++){	//连续读RecvQueue->MsgLen个字节
			RecvQueue->MsgBuff[*pbItem] = bReadSerialRecvQueue(RecvQueue);
			RecvQueue->MsgAdd += RecvQueue->MsgBuff[*pbItem];
			*pbItem = 0;          //一条消息接收完毕,复位消息
		}
		RecvQueue->MsgAdd -= RecvQueue->MsgBuff[*pbItem - 1];

		if(RecvQueue->MsgAdd == RecvQueue->MsgBuff[*pbItem - 1]){//累加和比较正确
			RecvQueue->MsgAdd = 0;//清累加和
			return 1;
		}
		else{
			RecvQueue->MsgAdd = 0;//清累加和                                    
			return 0;	 
		}
	}
}

⌨️ 快捷键说明

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