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

📄 sci.c

📁 一个串口终端解释程序。用于单片机调试串口的超级终端应用。
💻 C
📖 第 1 页 / 共 3 页
字号:
                            {
                                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 + -