📄 rs485.c
字号:
#include "port.h"
#include "function.h"
#include "Exvariable.h"
#include "ExHeadFileRs232.h"
void AnalysisRs485( void )
{
PageTemp=SFRPAGE;
if(RecFlagRs485)
{
Rs485RxBuffer[Rs485RxWritePointer++]=Rs485RxData;
}
else if(AnalysisFrameStartRs485())
{
return;
}
//分析数据长度
if (Rs485RxWritePointer == LocationFrLenRs485)
{
LenDataRs485 = Rs485RxData;
return;
}
//分析帧尾
if (Rs485RxWritePointer == (LenDataRs485 + LenFrExDataRs485))
{
if( Rs485RxData != FrameEndRs485)
{
RecFlagRs485=0;
LenDataRs485=0;
Rs485RxWritePointer=0;
}
else
{
RecFlagRs485=0;
Rs485RxWritePointer=0;
//校验
if(Security(&Rs485RxBuffer,LenDataRs485,LenFrExDataRs485))
{
DisposeDataRs485Rx();
SFRPAGE=CONFIG_PAGE; SFRPAGE=CONFIG_PAGE;
LampRecModule=0x01;
}
else
{
LenDataRs485=0;
SFRPAGE=CONFIG_PAGE; SFRPAGE=CONFIG_PAGE;
LampRecModule=0x01;
}
}
}
}
unsigned char AnalysisFrameStartRs485(void)
{
// RI0 = 0;
// Rs485RxData = SBUF0;
//如果程序正在分析上位机指令;
//或正在向组合模块发送指令;
//或正在等待组合模块回馈上位机指令
//时,上位机又来了指令,这时可以抛弃以上三种情况不管,
//重新接收上位机指令,解析上位机指令,
//向组合模块发送指令,等待组合模块回馈信息
//if (Analyse_UpMachine_Flag)
// return;
if (Rs485RxWritePointer>30)
{
RecFlagRs485=0;
LenDataRs485=0;
Local_mvRs485=1;
Rs485RxWritePointer=0;
return 0;
}
if (!RecFlagRs485)//判断接收标志
{
if (Rs485RxData != FrameStartRs485)
{
return 0;
}
else
{
Rs485RxWritePointer = 0;
Rs485RxBuffer[Rs485RxWritePointer++]=Rs485RxData;
Local_mvRs485=0x01;//定义帧头出现的位置
RecFlagRs485=0x01;
SFRPAGE=CONFIG_PAGE;
LampRecModule=0x00;
return 1;
}
}
}
void DisposeDataRs485Rx(void)
{
//数据移至过渡缓冲区
MoveToTranBuffRs485();
CountT0=0x03;
//关掉计时器计时
SFRPAGE=TIMER01_PAGE;
TR0=0;
TF0=0;
StateTableRs485.count--;
if((StateTableRs485.count)==0x00)
{
StateTableRs485.RecCompleteRs485=1;
}
else //要求监控盘向组合模块发送下一帧数据
{
SendToModuleFlag=1;
}
}
//数据移至过渡缓冲区
void MoveToTranBuffRs485(void)
{
char i;
switch( Commands)
{
// 运行参数1、运行参数2上来自上位机指令
// 查询功放低噪放的状态
//功放:输出功率、驻波比、温度、ALC值、ATT值、功放开关
//低噪放:输出功率(单独一条指令完成)、ALC值、ATT值
case 0x21:
case 0xec:
switch(StateTableRs485.count)
{
//LNA查询中只要保存LNA ATT 值
case 3:
*(TranBuffRs485++)=Rs485RxBuffer[7];
break;
case 2:
//PA查询值
for(i=0;i<7;i++)
{
*(TranBuffRs485++)=Rs485RxBuffer[6+i];
}
break;
case 1:
//lna det
*(TranBuffRs485++)=Rs485RxBuffer[7];
// *(TranBuffRs485++)=0x00;//后面没有数据了
break;
default:
break;
}
break;
//设置模块ATT
case 0x35:
// StateTableRs485.count--;
/* if((StateTableRs485.count)==0x01)
{
for(i=0;i<10;i++)
{
*(TranBuffRs485++)=0x00;
}
}*/
//没有返回值
break;
//查看模块
case 0xeb:
break;
//控制功放开关
case 0x34:
//没有返回值
break;
case 0x01:
SFRPAGE=CONFIG_PAGE;
LampStateMonitor=!LampStateMonitor;
DisposeLookupModule();
break;
}
}
void TransferToUp(void)
{
unsigned char i;
unsigned char buffer[10];
i=0;//i在实现查看模块时用于计数
TranBuffRs485=&Rs485RxBuffer[40];
for(i=0;i<10;i++)
{
buffer[i]=*(TranBuffRs485++);
}
for(i=0;i<75;i++)
{
Rs485RxBuffer[i]=0x00;
}
switch( Commands )
{
// 运行参数1、运行参数2上来自上位机指令
// 查询功放低噪放的状态
//功放:输出功率、驻波比、温度、ALC值、ATT值、功放开关
//低噪放:输出功率(单独一条指令完成)、ALC值、ATT值
case 0x21:
case 0xec:
//填命令号
Rs485RxBuffer[5]=Commands;
//填帧长度
Rs485RxBuffer[12]=0x2f;
//低噪放输出功率
Rs485RxBuffer[12+17]=buffer[8];
//下行功放温度
Rs485RxBuffer[12+26]=buffer[3];
//下行驻波比
Rs485RxBuffer[12+24]=buffer[5];
//低噪放ATT
Rs485RxBuffer[12+34]=buffer[0];
//功放ATT
Rs485RxBuffer[12+37]=buffer[6];
//功放ALC
Rs485RxBuffer[12+43]=buffer[4];
//上行设备输出功率
Rs485RxBuffer[12+19]=buffer[8];
// 下行设备输出功率
Rs485RxBuffer[12+20]=buffer[7];
// 下行功放开关
if( buffer[1]&0x01)
{
Rs485RxBuffer[12+12]|=0x20;
}
else
{
Rs485RxBuffer[12+12]&=0xdf;
}
//下行驻波比告警
buffer[0]=0x00;
Rs485RxBuffer[12+14]=0x00;
SFRPAGE=CONFIG_PAGE;
fEepromRead( &buffer,0x0041);
if(((buffer[1]&0x08)==0x08)&&(( buffer[0]&0x02)==0x02) )
{
Rs485RxBuffer[12+14]|=0x01;
}
//下行功放过温告警
if(((buffer[1]&0x04)==0x04)&&(( buffer[1]&0x08)==0x08))
{
Rs485RxBuffer[12+14]|=0x02;
}
//上行设备输入功率
//功率检测模块输出值
Rs485RxBuffer[12+21]=buffer[9];
//还有告警的1字节
//没有查到对应放在上位机通讯协议帧中的哪一位
TransmitAckRs232();
break;
//设置模块ATT
case 0x35:
//填命令号
Rs485RxBuffer[5]=0x35;
//填应答标志
Rs485RxBuffer[11]=0x00;
//数据长度
Rs485RxBuffer[12]=0x00;
TransmitAckRs232();
break;
//查看模块
case 0xeb:
SFRPAGE=CONFIG_PAGE;
fEepromReadS( &Rs485RxBuffer[14],0x00,0x06);
Rs485RxBuffer[13]=0x00;
if( ( Rs485RxBuffer[14]==0x01)&&( Rs485RxBuffer[15]==0x08))
{
Rs485RxBuffer[13]++;
}
if( ( Rs485RxBuffer[18]==0x09)&&( Rs485RxBuffer[19]==0x08))
{
Rs485RxBuffer[13]++;
}
if( ( Rs485RxBuffer[16]==0x08)&&( Rs485RxBuffer[17]==0x00))
{
Rs485RxBuffer[13]++;
}
//填命令号
Rs485RxBuffer[5]=0xeb;
Rs485RxBuffer[12]=0x07;
TransmitAckRs232();
break;
//控制功放开关
case 0x34:
//填命令号
Rs485RxBuffer[5]=0x34;
//填应答标志
Rs485RxBuffer[11]=0x00;
//数据长度
Rs485RxBuffer[12]=0x00;
TransmitAckRs232();
break;
case 0x01:
//当监控盘查询完组合模块的模块地址以后,
//开UART0;接收上位机指令
// ET0=1;
// UART0EN=1;
PageTemp=SFRPAGE;
SFRPAGE=CONFIG_PAGE ;
XBR0|=0x04;
SFRPAGE=PageTemp;
break;
//直放站设置初始化向导(1/6)---直放站编号
case 0xd0:
//直放站设置初始化向导(1/6)---直放站编号(没有特权指令)
case 0x30:
//填命令号
Rs485RxBuffer[5]=Commands;
//填应答标志
Rs485RxBuffer[11]=0x00;
//数据长度
Rs485RxBuffer[12]=0x00;
TransmitAckRs232();
break;
//直放站设置初始化向导(3/6)----通讯参数
case 0x31:
break;
//直放站设置初始化向导(4/6)-----告警使能
case 0x32:
//填命令号
Rs485RxBuffer[5]=Commands;
//填应答标志
Rs485RxBuffer[11]=0x00;
//数据长度
Rs485RxBuffer[12]=0x00;
TransmitAckRs232();
break;
//直放站设置初始化向导(5/6)----功率门限
case 0x33:
break;
//直放站设置初始化向导(3/6)----通讯参数(没有特权指令)
case 0xd:
break;
case 0xff:
case 0x10:
//填命令号
Rs485RxBuffer[5]=Commands;
//填应答标志
Rs485RxBuffer[11]=0x00;
//数据长度
Rs485RxBuffer[12]=0x00;
TransmitAckRs232();
break;
default:
break;
}
}
void TransmitAckRs232(void)
{
unsigned char CrcH, CrcL,CommandLen;
// unsigned char buffer[];
Rs485RxBuffer[0]=FrameStartRs232;
//接下来待发送指令是直接赋值的,
//以后可能要改
Rs485RxBuffer[1]=0x04;
Rs485RxBuffer[2]=0x01;
Rs485RxBuffer[3]=0x01;
Rs485RxBuffer[4]=0x05;
SFRPAGE=CONFIG_PAGE;
fEepromReadS(&Rs485RxBuffer[6],0x0015,0x05);
// Rs485RxBuffer[6]=0x78;
// Rs485RxBuffer[7]=0x56;
// Rs485RxBuffer[8]=0x34;
// Rs485RxBuffer[9]=0x12;
//设备编号
Rs485RxBuffer[10]=0xff;
Rs485RxBuffer[11]=0x00;
//校验
CommandLen = Rs485RxBuffer[12];
Crc1021((Rs485RxBuffer + 1), (CommandLen +12), &CrcH, &CrcL);
Rs485RxBuffer[13 + CommandLen] = CrcL;
Rs485RxBuffer[14 + CommandLen] = CrcH;
Rs485RxBuffer[15 + CommandLen] =FrameEndRs232;
Rs232TxSendPointer = 0;
Rs232SendLen = 16 + CommandLen ;
PageTemp=SFRPAGE;
LampSendUp=0x00;
//允许接收上位机指令
AnalysisFlag=0x00;
SFRPAGE=UART0_PAGE;
SBUF0 = Rs485RxBuffer[Rs232TxSendPointer++];
SFRPAGE=PageTemp;
}
void DisposeLookupModule( void )
{
unsigned int i;
//查到LNA DET 模块
if( ( Rs485RxBuffer[1]==0x01 ) && ( Rs485RxBuffer[2]==0x08 ) )
{
SFRPAGE=CONFIG_PAGE;
fEepromWriteS( &Rs485RxBuffer[1],0x0000,0x02);
WriteDisable();
for(i=0;i<4500;i++);
Rs485RxBuffer[30]++;
Rs485RxBuffer[31]=0x00;
SendToModuleFlag=1;
}
//查到PA 模块
if( ( Rs485RxBuffer[1]==0x08 ) && ( Rs485RxBuffer[2]==0x00 ) )
{
SFRPAGE=CONFIG_PAGE;
fEepromWriteS( &Rs485RxBuffer[1],0x0002,0x02);
WriteDisable();
for(i=0;i<4500;i++);
Rs485RxBuffer[31]=0x01;
SendToModuleFlag=1;
}
//查到LNA 模块
if( ( Rs485RxBuffer[1]==0x09 ) && ( Rs485RxBuffer[2]==0x08 ) )
{
SFRPAGE=CONFIG_PAGE;
fEepromWriteS( &Rs485RxBuffer[1],0x0004,0x02);
WriteDisable();
for(i=0;i<4500;i++);
Rs485RxBuffer[31]=0x09;
SendToModuleFlag=1;
}
CountT0=0x03;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -