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

📄 sci.c

📁 一个串口终端解释程序。用于单片机调试串口的超级终端应用。
💻 C
📖 第 1 页 / 共 3 页
字号:
    *TempUIPtr = (unsigned int)(UploadSoc>>24);                   //8
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(CurrSmpcnt);                //9
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(CurrSmpcnt>>8);             //10
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(CompensatedEAbsoluteAngle & 0x00ff);     //11
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)((CompensatedEAbsoluteAngle & 0xff00) >> 8);  //12
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(GpsStat.Word);              //13
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(GpsStat.Word>>8);           //14
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(CompensatedPowerAngle);     //15
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(CompensatedPowerAngle>>8);  //16

    if (UploadDataType == 1)
    {
        TempUI = U.CompensateValue;
    }
    else if (UploadDataType == 2)
    {
        TempUI = RunStat;
    }
    else
    {
        TempUI = E.CompensateValue;
    }
    if (++UploadDataType > 2)
    {
        UploadDataType = 0;
    }

    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)TempUI;                      //17
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(TempUI>>8);                 //18
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(RotateSpeed);               //19
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr = (unsigned int)(RotateSpeed>>8);            //20
    CheckSum ^= *TempUIPtr++;
    *TempUIPtr++ = CheckSum;                                //21
    *TempUIPtr++ = 0x42;                                    //22

    WriteSendRcm3200QueuePtr->DataLength = 23;
    if (++WriteSendRcm3200QueuePtr >= &SendRcm3200Queue[SEND_RCM3200_QUEUE_DEPTH])
    {
        WriteSendRcm3200QueuePtr = &SendRcm3200Queue[0];
    }
}
/*****end of 填写内电势测量数据报文缓冲区*****/


/*****填写RCM3200串口巡检报文缓冲区*****/
#pragma interrupt
void WriteRcm3200PatrolRpt(void)
{
    if ((WriteSendRcm3200QueuePtr->DataLength != 0) && (WriteSendRcm3200QueuePtr == ReadSendRcm3200QueuePtr))
    //当前正在发送此帧报文
    {
        if (++WriteSendRcm3200QueuePtr >= &SendRcm3200Queue[SEND_RCM3200_QUEUE_DEPTH])
        {
            WriteSendRcm3200QueuePtr = &SendRcm3200Queue[0];
        }
    }
    WriteSendRcm3200QueuePtr->Data[0] = 0x39;
    WriteSendRcm3200QueuePtr->Data[1] = 0x55;
    WriteSendRcm3200QueuePtr->Data[2] = 0x42;
    WriteSendRcm3200QueuePtr->DataLength = 3;
    if (++WriteSendRcm3200QueuePtr >= &SendRcm3200Queue[SEND_RCM3200_QUEUE_DEPTH])
    {
        WriteSendRcm3200QueuePtr = &SendRcm3200Queue[0];
    }
}
/*****end of 填写RCM3200串口巡检报文缓冲区*****/


/*****向数显表发送报文*****/
void SendDataToMeter(void)
{
    if (!Sci1SendFlag)
    {
        if (InitMeterDisplayFlag)   //上电后首先初始化数显表示数
        {
            InitMeterDisplayFlag = 0;
            RealDisplayData = 0;
            WriteMeterBuf(0,0);     //不带负号,无小数点
            InitSci1Trans();        //初始化SCI1的发送(向数据表发送数据)
            Sci1SendFlag = TRUE;
        }
        else
        {
            if ((ClockRecFinishCounter > 0) && (ClockRecFinishCounter < 300))   //GPS串口报文接收结束后300ms内,允许开始向数显表发送数据
            {
                //从拨码开关判别数显表输出数据
                if ((*GPIO_B_DR & 0x0006) == 2)
                {
                    MeterOutputDataType = 1;    //输出内电势绝对角
                    OutputMetereData = CompensatedEAbsoluteAngle;
                }
                else if ((*GPIO_B_DR & 0x0006) == 4)
                {
                    MeterOutputDataType = 2;    //发电机转速

#ifdef ZOOM_ROTATE_SPEED
                    OutputMetereData = RotateSpeed / 10;
                    if ((RotateSpeed - OutputMetereData * 10) >= 5)
                    {
                        OutputMetereData += 1; 
                    }
#else                   
                    OutputMetereData = RotateSpeed;
#endif               
     
                }
                else
                {
                    MeterOutputDataType = 0;    //输出发电机功角
                    OutputMetereData = CompensatedPowerAngle;
                }

                if (OutputMetereData != 0xffff)
                {
                    //更新数显表类型设置
                    MeterType = RunStat & 0x8000;
                    if (MeterType)
                    {
                        MeterAddress = ((RunStat & 0x1f00) >> 8);
                    }

                    if (MeterOutputDataType <= 1)
                    {
                        if ((OutputMetereData < 0) && (OutputMetereData >= -900))   //-90度~0度
                        {
                            if (!MeterType) //使用新型号的数显表
                            {
                                RealDisplayData = -OutputMetereData;
                                WriteMeterBuf(1, 1);    //带负号,有小数点
                            }
                            else    //使用旧型号的数显表,不能显示负数
                            {
                                RealDisplayData = OutputMetereData + 3600;
                                WriteMeterBuf(0, 1);    //不带负号,有小数点
                            }
                        }
                        else if (OutputMetereData < -900)       //-180度~180度
                        {
                            RealDisplayData = OutputMetereData + 3600;
                            WriteMeterBuf(0, 1);    //不带负号,有小数点
                        }
                        else            //0度~180度
                        {
                            RealDisplayData = OutputMetereData;
                            WriteMeterBuf(0, 1);    //不带负号,有小数点
                        }
                    }
                    else    //MeterOutputDataType=2
                    {
                        RealDisplayData = OutputMetereData;
                        WriteMeterBuf(0, 0);    //不带负号,无小数点
                    }
                    InitSci1Trans();    //初始化SCI1的发送(向数据表发送数据)
                    Sci1SendFlag = TRUE;
                }
            }
        }
    }
    else
    {
        if (Sci1SwitchCounter)
        {
            if ((*SCI1_SCISR & 0x4000) || (Sci1SwitchCounter >= 20))
            //SCI1串口数据发送完毕或最后一个数据发送后20ms,切换到串口接收状态
            {
                Sci1SwitchCounter = 0;
                Sci1SendFlag = 0;
                ClockRecFinishCounter = 0;
                InitSci1Rec();      //初始化SCI1的接收(接收GPS时钟信号)
            }
        }
        else if (*SCI1_SCISR & 0x8000)  //SCIDR可以写入新的数据
        {
            *SCI1_SCIDR = *Sci1SendBufPtr++;
            if (!MeterType) //使用新型号的数显表
            {
                if (Sci1SendBufPtr > &SendMeterBuf[10])
                {
                    Sci1SwitchCounter = 1;
                    Sci1SendBufPtr = &SendMeterBuf[0];
                }
            }
            else    //使用旧型号的数显表
            {
                if (Sci1SendBufPtr > &SendMeterBuf[7])
                {
                    Sci1SwitchCounter = 1;
                    Sci1SendBufPtr = &SendMeterBuf[0];
                }
            }
            //FOR TEST!!!
            DEBUG2_LED_TURN_OFF;
            //END FOR TEST!!!
        }
    }
}
/*****end of 向数显表发送报文*****/


/*****填写数显表报文缓冲区,sign:0-不带负号,1-带负号;dot:0-不带小数点,1-带小数点*****/
void WriteMeterBuf(unsigned int sign, unsigned int dot)
{
    unsigned int TempUI1;
    unsigned int TempUI2;
    unsigned int TempUI3;

    if (!MeterType) //使用新型号的数显表
    {
        SendMeterBuf[0] = 0x22;                 //" 定界符
        SendMeterBuf[1] = 0x30;                 //0 数码表地址
        SendMeterBuf[2] = 0x31;                 //1 数码表地址
        SendMeterBuf[3] = 0x30;                 //0 缓冲区首址
        SendMeterBuf[4] = 0x31;                 //1 缓冲区首址
        TempUI1 = (RealDisplayData / 1000);
        if (sign)
        {
            SendMeterBuf[5] = 0x2D;
        }
        else
        {
            SendMeterBuf[5] = 0x30 + TempUI1;                   //千位
        }
        TempUI2 = RealDisplayData - TempUI1 * 1000;
        TempUI3 = TempUI2 / 100;
        SendMeterBuf[6] = 0x30 + TempUI3;                   //百位
        TempUI1 = TempUI2 - TempUI3 * 100;
        TempUI2 = TempUI1 /10;
        SendMeterBuf[7] = 0x30 + TempUI2;                   //十位
        if (dot)
        {
            SendMeterBuf[8] = 0x2E;                 //小数点
            SendMeterBuf[9] = 0x30 + TempUI1 - TempUI2 * 10;        //个位
        }
        else
        {
            SendMeterBuf[8] = 0x30 + TempUI1 - TempUI2 * 10;        //个位
            SendMeterBuf[9] = 0x2E;                 //小数点
        }
        SendMeterBuf[10] = 0x0D;                //结束符
    }
    else    //使用旧型号的数显表,不能显示负数
    {
        SendMeterBuf[0] = 0xeb;
        SendMeterBuf[1] = 0x90;
        SendMeterBuf[2] = 0x02;
        SendMeterBuf[3] = 0x04;
        SendMeterBuf[4] = 0x80;
        if (dot) 
        {
            SendMeterBuf[4] |= 0x10;
        }
        SendMeterBuf[5] = MeterAddress;  //地址码
        TempUI1 = RealDisplayData / 1000;               //千位
        TempUI2 = RealDisplayData - TempUI1 * 1000;
        TempUI3 = TempUI2 / 100;                        //百位
        SendMeterBuf[6] = (TempUI1<<4) + TempUI3;
        TempUI1 = TempUI2 - TempUI3 * 100;
        TempUI2 = TempUI1 / 10;                         //十位
        TempUI3 = TempUI1 - TempUI2 * 10;               //个位
        SendMeterBuf[7] = (TempUI2<<4) + TempUI3;
    }
    Sci1SendBufPtr = &SendMeterBuf[0];
}
/*****end of 填写数显表报文缓冲区*****/


⌨️ 快捷键说明

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