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

📄 rs485.c

📁 it is code for briging up_machtion to down machtion,it s functions act protol changing and comunica
💻 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 + -