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

📄 process.c

📁 湖北水文信息系统水位雨量采集器的C51源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****--------------文件信息-----------------------------------------------------
**文   件   名: process.C
**最后修改日期: 2006-4-13
**描        述: 对串口接收的数据进行处理
**设计者      : jxf
***********************************************************************************/
#include "process.h"
#include "proccomm.h"
#include "recframe.h"
#include "scan.h"
#include "string.h"
#include "time.h"
#include "cond.h"

uchar  i2c_addr=0x00;	

/*******************************************************************
                     字符转二进制函数               
函数原型: uint CHAR_TO_INT(uchar tmp[],uchar len)
功  能:       
  
********************************************************************/
uint CHAR_TO_INT(uchar tmp[],uchar len)
{
	uint xdata hex=0;
	uchar i;

 	for(i=0;i<len;i++)
  {
		hex=(tmp[i]&0x0f)+hex*10;
  }
  return hex;
}

/*******************************************************************
                     字符转二进制函数               
函数原型: ulong CHAR_TO_LONG(uchar tmp[],uchar len)
功  能:       
  
********************************************************************/
ulong CHAR_TO_LONG(uchar tmp[],uchar len)
{
	ulong xdata hex=0;
	uchar i;

 	for(i=0;i<len;i++)
  {
		hex=(tmp[i]&0x0f)+hex*10;
  }
  return hex;
}


/*******************************************************************
                     改变发送状态             
函数原型: void Rec_to_Send(void)
功  能:       
  
********************************************************************/
void Rec_to_Send(void)
{
		r_end=0;
		s_end=0;
		p_end=1;					
		con_485=S_CON;
		TI=1;
		send_lamp=!send_lamp;	
}


/*******************************************************************
                     采集器应答集中器函数设置               
函数原型: void  cl_ack_ct(unsigned char p,unsigned char t,unsigned char ack)
功  能:       
  
********************************************************************/
void  cl_ack_ct(unsigned char p,unsigned char t,unsigned char ack)
{
	unsigned char i;
  
  SenBuf[3]=t; 
  
  if(ack>0)
			SenBuf[5]=(p|0x80); 
	else
			SenBuf[5]=(p|0xc0);  
			 
	SenBuf[6]=0;
	
	for(i=0;i<SenBuf[6]+7;i++)
			cs+=SenBuf[i];
      
  SenBuf[SenBuf[6]+7]=cs;
	SenBuf[SenBuf[6]+8]=FRAME_END_CHAR;
	Senlen=SenBuf[6]+9;	
}


/*******************************************************************
                     雨量数据函数               
函数原型: char RainFall_Process(uchar cntr,ulong rain, uchar len)
功  能:       
  
********************************************************************/
char RainFall_Process(uchar cntr,ulong rain, uchar len)
{
  uchar i;
	ulong  xdata Total_RainFall=0;
	uchar  xdata Send_RainFall[5];
	static uchar Last_RainFall[5]={0x30,0x30,0x30,0x30,0x30};
	
	for(i=0;i<5;i++)
		Send_RainFall[i]=0;
   
  SenBuf[3]=0x01;   
 	SenBuf[5]=(cntr|0x80);
 	
 	switch(len)
	{
		case 0:
						Total_RainFall=rain*Mult_Rainfall;
						break;
		case 1:
						Total_RainFall=rain;
						break;
	
	  case 2 : 
						Total_RainFall=rain*Mult_Rainfall;
						break;
	}		
	
	Send_RainFall[4]=Total_RainFall%10+0x30;
	Send_RainFall[3]=(Total_RainFall/10)%10+0x30;
	Send_RainFall[2]=(Total_RainFall/100)%10+0x30;
	Send_RainFall[1]=(Total_RainFall/1000)%10+0x30;
	Send_RainFall[0]=(Total_RainFall/10000)%10+0x30;
	
	SenBuf[6]=0x00; 	
			
	switch(len)
	{
		case 0:
						SenBuf[6]=0x05; 

						for(i=0;i<5;i++)
								SenBuf[7+i]=Send_RainFall[i];
						break;		
						
		case 1:
						SenBuf[6]=0x07; 

						SenBuf[8]=0x30; 
						for(i=0;i<5;i++)
								SenBuf[8+len+i]=Send_RainFall[i];
						break;
	
	  case 2 : 
						//add by jxf	060807	
						SenBuf[6]=0x0b; 
						SenBuf[7]=0x32; 
						
						for(i=0;i<5;i++)
								SenBuf[8+i]=Send_RainFall[i];		
							
						for(i=0;i<5;i++)
								SenBuf[13+i]=Last_RainFall[i];		
								
						for(i=0;i<5;i++)
								Last_RainFall[i]=Send_RainFall[i];
								
						break;
	}			

  cs=0;
  for(i=0;i<SenBuf[6]+7;i++)
			cs+=SenBuf[i];

	SenBuf[7+SenBuf[6]]=cs;
	SenBuf[8+SenBuf[6]]=FRAME_END_CHAR;
	Senlen=SenBuf[6]+9;   
		
	return 1; 
}


/*******************************************************************
                     水位数据处理函数               
函数原型: void WaterLevel_Process(void)
功  能: 
  
********************************************************************/

void WaterLevel_Process(void)
{
	char i,k;
	uint xdata tmp[5],t;
	
	for(i=0;i<5;i++)
		tmp[i]=Scan_WaterLevel[i];

	for(i=1;i<4;i++)
	for(k=0;k<4-i;k++)
	{
			if(tmp[k]>tmp[k+1])
			{
					t=tmp[k];tmp[k]=tmp[k+1];tmp[k+1]=t;
			}
	}	 
	
	WaterLevel=tmp[2]+Basic_WaterLevel;

}

/*******************************************************************
                     水位数据函数               
函数原型: char Waterlevel(unsigned char p,unsigned char len)
功  能: 
  
********************************************************************/
char Waterlevel(unsigned char p,unsigned char len)
{
   char i,k;
   ulong   xdata Total_WaterLevel=0;
   uchar   xdata Send_WaterLevel[5];   
	 static  uchar last_waterlevel[5]={0x30,0x30,0x30,0x30,0x30};  
	 
    for(i=0;i<5;i++)
				Send_WaterLevel[i]=0;

		Total_WaterLevel=WaterLevel;

		for(k=4;k>=0;k--)
   	{		
   			Send_WaterLevel[k]=(Total_WaterLevel%10)+0x30;
				Total_WaterLevel=Total_WaterLevel/10;
		}
	
		cs=0;
		SenBuf[3]=0x02;
		SenBuf[5]=(p|0x80);
		
		SenBuf[6]=0x00; 
	
		switch(len)
		{
			case 0:
						SenBuf[6]=0x05; 

						for(i=0;i<5;i++)
								SenBuf[7+i]=Send_WaterLevel[i];
						break;			
						
			case 1:
						SenBuf[6]=0x07; 

						SenBuf[8]=0x30; 
						
						for(i=0;i<5;i++)
								SenBuf[8+len+i]=Send_WaterLevel[i];
						break;
						
		  case 2 :	
		 				//add by jxf	060807									
						SenBuf[6]=0x0b; 
						SenBuf[7]=0x32;  

						for(i=0;i<5;i++)
								SenBuf[8+i]=Send_WaterLevel[i];
								
						for(i=0;i<5;i++)
								SenBuf[13+i]=last_waterlevel[i];	
								
						for(i=0;i<5;i++)
								last_waterlevel[i]=Send_WaterLevel[i];				
								
						break;			
		}

    
		for(i=0;i<SenBuf[6]+7;i++)
				cs+=SenBuf[i];

		SenBuf[7+SenBuf[6]]=cs;
		
		SenBuf[8+SenBuf[6]]=FRAME_END_CHAR;
		Senlen=SenBuf[6]+9;   
		
		return 1;
}


/*******************************************************************
                     召测数据函数               
函数原型: char Rd_collect(void)
功  能:       
  
********************************************************************/
char Rd_collect(void)
{  
	char ii=0,i=0;

	switch(RecBuf[3])
	{
	  case 1 : 
				 ii=RainFall_Process(RecBuf[5],Scan_RainFall,i);//将RainFall 换为Scan_RainFall  by xupeng
				 //去掉了RainFall=0;
				 return ii; 

	  case 2 :				
				ii=Waterlevel(RecBuf[5],i);
	 			return ii;
	}	 
	  
}


/*******************************************************************
                     自报雨量函数               
函数原型: void Rep_rainfall(void)
功  能:       
  
********************************************************************/
void Rep_rainfall(void)
{
   unsigned char fc,i=2;
   
	SenBuf[0]=FRAME_START_CHAR;
	SenBuf[1]=add[0];
	SenBuf[2]=add[1];	
	SenBuf[4]=FRAME_START_CHAR;
	 
	fc=0x03;
	RainFall_Process(fc,RainFall,i);
    
	RainFall=0;

	Rec_to_Send();
}


/*******************************************************************
                     自报水位函数               
函数原型: void Rep_waterlevel(void)
功  能: 
  
********************************************************************/
void Rep_waterlevel(void)
{
   unsigned char fc,i=2;
      
	 SenBuf[0]=FRAME_START_CHAR;
	 SenBuf[1]=add[0];
	 SenBuf[2]=add[1];	
	 SenBuf[4]=FRAME_START_CHAR;
   
   fc=0x03;
   Waterlevel(fc,i);
   
   Rec_to_Send();
}

/*******************************************************************
                     加报雨量函数               
函数原型: void Add_rainfall(unsigned long int sum_rainfall,unsigned char add_data)
功  能:       
  
********************************************************************/

void Add_rainfall(unsigned long int sum_rainfall,unsigned char add_data)
{
    unsigned char fc,k;
    k=1;
   
		SenBuf[0]=FRAME_START_CHAR;
		SenBuf[1]=add[0];
		SenBuf[2]=add[1];	
		SenBuf[4]=FRAME_START_CHAR;
	
		SenBuf[7]=add_data+0x30;

		if(add_data>9)
			SenBuf[7]=SenBuf[7]+0x07;
	 
		fc=0x08;
		RainFall_Process(fc,sum_rainfall,k);
   
		Rec_to_Send();
}


/*******************************************************************
                     加报水位函数               
函数原型: void Add_waterlevel(unsigned char add_data)
功  能: 
  
********************************************************************/

void Add_waterlevel(unsigned char add_data)
{
   unsigned char fc,k;
   
    k=1;
      
		SenBuf[0]=FRAME_START_CHAR;
		SenBuf[1]=add[0];
		SenBuf[2]=add[1];	
		SenBuf[4]=FRAME_START_CHAR;
	
   	SenBuf[7]=add_data+0x30;
    
		if(add_data>9)
	 	SenBuf[7]=SenBuf[7]+0x07;
   
  	fc=0x08;
   	Waterlevel(fc,k);
   
   	Rec_to_Send();
}

/*******************************************************************
                     配置基本水位函数               
函数原型: char config_basic_waterlevel(void)
功  能:       
  
********************************************************************/
char config_basic_waterlevel(void)
{
	unsigned char i;
	unsigned char xdata b_level[5];
	
	cs=0;

	for(i=0;i<5;i++)
	{
				b_level[i]=0;
	}	
	
	if((RecBuf[7]>=0x30)&&(RecBuf[7]<=0x39)&&(RecBuf[8]>=0x30)&&(RecBuf[8]<=0x39)&&
		 (RecBuf[9]>=0x30)&&(RecBuf[9]<=0x39)&&(RecBuf[10]>=0x30)&&(RecBuf[10]<=0x39)&&
		 (RecBuf[11]>=0x30)&&(RecBuf[11]<=0x39)&&(RecBuf[6]==0x05))
  {
			for(i=0;i<5;i++)
      			 	b_level[i]=RecBuf[7+i];	
      			 	
 			Basic_WaterLevel=CHAR_TO_LONG(b_level,5);      	 		
		
			W_block(WPAGE5,i2c_addr_basic_level,&b_level,5);
			
			cl_ack_ct(RecBuf[5],RecBuf[3],1); 
	 }
	 else
	 		cl_ack_ct(RecBuf[5],RecBuf[3],0); 
	 
	 return 1;
}


/*******************************************************************
                     配置雨量倍数函数               
函数原型: char config_Multiplier_rainfall(void)
功  能:       
  
********************************************************************/
char config_Multiplier_rainfall(void)
{
	cs=0;
	
	if((RecBuf[7]>=0x30)&&(RecBuf[7]<=0x39)&&(RecBuf[6]==0x01)&&(RecBuf[3]==0x01))
  {
 			Mult_Rainfall=CHAR_TO_LONG(&RecBuf[7],1);      	 		
		
			W_block(WPAGE5,i2c_addr_mult_rainfall,&Mult_Rainfall,1);
			
			cl_ack_ct(RecBuf[5],RecBuf[3],1); 
	 }
	 else
	 		cl_ack_ct(RecBuf[5],RecBuf[3],0); 
	 
	 return 1;
}

/*******************************************************************
                     写配置函数               
函数原型: char Wr_cfg(void)
功  能:       
  
********************************************************************/
char Wr_cfg(void)
{
	unsigned char i;
	unsigned char xdata cr_cfg[3],new_cfg[3];
	
	cs=0;

⌨️ 快捷键说明

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