📄 time.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 + -