📄 process.c
字号:
/*****--------------文件信息-----------------------------------------------------
**文 件 名: 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 + -