📄 sci.c
字号:
{
asm(nop);
asm(nop);
asm(nop);
}
}
else
{
GpsReachTimeErrorCnt = 0;
}
//end for test!!!*****/
}
}
}
break;
}
}
}
/*****end of SCI1接收中断服务程序(接收GPS串口报文)*****/
/*****利用接收的串口报文计算SOC*****/
void CalSoc(void)
{
unsigned int i;
unsigned int CheckSum;
unsigned int Week;
unsigned long Second;
unsigned int CommaCounter;
unsigned int LeapSecOkFlag; //2007.1.22
//CheckSum = (RecSci1Buf[RecSci1BufPtr-4])*16 + (RecSci1Buf[RecSci1BufPtr-3]);
//两个校验字符为ASCII形式的16进制数
if ((RecSci1Buf[RecSci1BufPtr-4] >= 65) && (RecSci1Buf[RecSci1BufPtr-4] <= 70))
{
CheckSum = (RecSci1Buf[RecSci1BufPtr-4]-55) * 16;
}
else if ((RecSci1Buf[RecSci1BufPtr-4] >= 48) && (RecSci1Buf[RecSci1BufPtr-4] <= 57))
{
CheckSum = (RecSci1Buf[RecSci1BufPtr-4]-48) * 16;
}
else
{
InitSci1RecVariable();
Sci1RecErrFlag = 1;
return;
}
if ((RecSci1Buf[RecSci1BufPtr-3] >= 65) && (RecSci1Buf[RecSci1BufPtr-3] <= 70))
{
CheckSum += (RecSci1Buf[RecSci1BufPtr-3]-55);
}
else if ((RecSci1Buf[RecSci1BufPtr-3] >= 48) && (RecSci1Buf[RecSci1BufPtr-3] <= 57))
{
CheckSum += (RecSci1Buf[RecSci1BufPtr-3]-48);
}
else
{
InitSci1RecVariable();
Sci1RecErrFlag = 1;
return;
}
if (Sci1CheckSum != CheckSum) //报文校验失败
{
InitSci1RecVariable();
Sci1RecErrFlag = 1;
return;
}
else //报文校验通过,提取SOC时标
{
Sci1RecErrTime = 0;
Sci1RecErrFlag = 0;
ClockRecFinishCounter = 1; //串口报文接收完毕
CommaCounter = 0;
Week = 0;
Second = 0;
LeapSecond = 0;
LeapSecOkFlag = FALSE; //2007.1.22
for (i=0; i<(RecSci1BufPtr-5); i++)
{
if (RecSci1Buf[i] == 44)
{
CommaCounter++;
}
else if (CommaCounter == 1)
{
if ((RecSci1Buf[i] >= 48) && (RecSci1Buf[i] <= 57))
{
Week = Week*10 + RecSci1Buf[i] - 48;
}
}
else if (CommaCounter == 2)
{
if ((RecSci1Buf[i] >= 48) && (RecSci1Buf[i] <= 57))
{
Second = Second*10 + RecSci1Buf[i] - 48;
}
}
else if (CommaCounter == 5)
{
if ((RecSci1Buf[i] >= 48) && (RecSci1Buf[i] <= 57))
{
LeapSecond = LeapSecond*10 + RecSci1Buf[i] - 48;
LeapSecOkFlag = TRUE; //2007.1.22
}
}
else if (CommaCounter == 11)
{
if ((RecSci1Buf[i] >= 48) && (RecSci1Buf[i] <= 50))
{
FixType = RecSci1Buf[i] - 48; //GPS锁星状况
}
if (FixType == 2) //3D Fix
{
if (!RealFixFlag)
{
if (GpsFixCounter++ >= 3) //GPS卫星锁定3秒后,将RealFixFlag置位,认为此时PPS才真正有效
{
RealFixFlag = TRUE;
}
}
}
else
{
RealFixFlag = 0;
GpsFixCounter = 0;
}
}
}
//2007.1 增加闰秒标志的处理
if (LeapSecOkFlag) //从报文中解出了有效闰秒时间
{
if (LeapSecond - LastLeapSecond == 1)
{
LeapSecFlag = TRUE;
LeapSecDir = FALSE; //add
}
else if (LastLeapSecond - LeapSecond == 1)
{
LeapSecFlag = TRUE;
LeapSecDir = TRUE; //delete
}
else
{
LeapSecFlag = FALSE;
LeapSecDir = FALSE;
}
LastLeapSecond = LeapSecond;
UploadLeapSecond = LeapSecond; //闰秒一旦更改立即上送,不再等待整秒
}
/*for test!!
GpsReachTime.FixStat[GpsReachTimeWritePtr] = FixType;
if (++GpsReachTimeWritePtr >= 20)
{
GpsReachTimeWritePtr = 0;
}
//end for test!!!*/
if (!PpsOutputFlag) //还未开始输出虚拟PPS阶段
{
if ((GpsReportReachTimeCounter < 14000000) || (GpsReportReachTimeCounter > 37600000))
{ //报文到来时刻不合要求,报文的时间信息不能利用
InitSci1RecVariable();
SocStableCounter = 0;
return;
}
}
else //已经开始输出PPS阶段
{
if ((GpsReportReachTime < 350) || (GpsReportReachTime > 940))
{ //报文到来时刻不合要求,报文的时间信息不能利用
InitSci1RecVariable();
SocStableCounter = 0;
return;
}
}
if (Week != 0)
{
asm (BFSET #0x0300, SR); //禁用所有可屏蔽中断
Time = 604800*Week + Second + BASE_SECOND; //原子钟(GPS)时间,格零威制时间,从1970年开始
asm (BFCLR #0x0200, SR); //开启可屏蔽中断
NoSocCounter = 0;
SocErr = 0;
}
InitSci1RecVariable();
}
}
/*****end of 利用接收的串口报文计算SOC*****/
/*****向RCM3200发送报文*****/
void SendDataToRcm3200(void)
{
unsigned int i;
if (!Sci0SendFlag) //当前发送端口空闲
{
if (ReadSendRcm3200QueuePtr != WriteSendRcm3200QueuePtr)
{
if (ReadSendRcm3200QueuePtr->DataLength != 0) //发送队列中存在尚未发送的报文
{
Sci0SendBufCurrPtr = &Sci0SendBuf[0];
Sci0SendBufEndPtr = &Sci0SendBuf[0];
for (i=0; i<(ReadSendRcm3200QueuePtr->DataLength); i++)
{
*Sci0SendBufEndPtr++ = ReadSendRcm3200QueuePtr->Data[i];
}
ReadSendRcm3200QueuePtr->DataLength = 0;
Sci0SendFlag = TRUE;
}
if (++ReadSendRcm3200QueuePtr >= &SendRcm3200Queue[SEND_RCM3200_QUEUE_DEPTH])
{
ReadSendRcm3200QueuePtr = &SendRcm3200Queue[0];
}
}
}
if (Sci0SendFlag) //当前报文帧未发送完毕
{
if (*SCI0_SCISR & 0x8000)
{
i = *Sci0SendBufCurrPtr++;
*SCI0_SCIDR = (i & 0x00ff);
if (Sci0SendBufCurrPtr >= Sci0SendBufEndPtr)
{
Sci0SendFlag = 0;
}
}
}
}
/*****end of 向RCM3200发送报文*****/
/*****填写内电势测量数据报文缓冲区*****/
#pragma interrupt
void WriteRcm3200DataRpt(void)
{
unsigned int CheckSum;
unsigned int *TempUIPtr;
unsigned int TempUI;
CheckSum = 0;
if ((WriteSendRcm3200QueuePtr->DataLength != 0) && (WriteSendRcm3200QueuePtr == ReadSendRcm3200QueuePtr))
//当前正在发送此帧报文,错开队列写入位置
{
if (++WriteSendRcm3200QueuePtr >= &SendRcm3200Queue[SEND_RCM3200_QUEUE_DEPTH])
{
WriteSendRcm3200QueuePtr = &SendRcm3200Queue[0];
}
}
TempUIPtr = &(WriteSendRcm3200QueuePtr->Data[0]);
*TempUIPtr++ = 0x36; //0
*TempUIPtr = (unsigned int)(DetailErrInfo.Word); //1
CheckSum = *TempUIPtr++;
*TempUIPtr = (unsigned int)(DetailErrInfo.Word>>8); //2
CheckSum ^= *TempUIPtr++;
*TempUIPtr = (UploadLeapSecond << 3) | (CPU_VERSION_LARGE & 0x0007); //3
CheckSum ^= *TempUIPtr++;
*TempUIPtr = CPU_VERSION_SMALL; //4
CheckSum ^= *TempUIPtr++;
*TempUIPtr = (unsigned int)(UploadSoc); //5
CheckSum ^= *TempUIPtr++;
*TempUIPtr = (unsigned int)(UploadSoc>>8); //6
CheckSum ^= *TempUIPtr++;
*TempUIPtr = (unsigned int)(UploadSoc>>16); //7
CheckSum ^= *TempUIPtr++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -