📄 sci.c
字号:
*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 + -