📄 rs485.c
字号:
/*------------------------------------------------*/
/*
串口通讯程序,分与分机通讯程序和与管理机通讯程序,
Rs_int是中断程序, 负责对通讯的接收、发送
Message_treat是主要的针对通讯以后的处理程序
*/
/*----------------------------------------------------*/
#include "defineh.h"
#include "sbitdef.h"
#include "Rs485.h"
/*----------------------------------------------------*/
extern void Count_Flash_Offset(void);
extern void Clr_Display(void);
extern void disp_detail(void);
extern void disp_main(void);
extern void No_Message_Guide(void);
extern void Inqire_Frame(void);
extern void disp_color(uchar row);
extern void init_timer2(void);
extern void init_timer0();
extern void clr_timer2();
extern void delay();
void answer_comm();
/*---------------------------------------*/
void delays60ms()
{
uchar data j;
uint data i;
for(j=0;j<3;j++)
for(i=0;i<=4000;i++);
}
/*-----------------------------------------*/
void Clr_Rx()
{
Rx_bit=0;//no received a valid frame
Rx_count=0;//count for bytes
Rx_sum=0; //a frame check_sum
}
/*----------------------------------------*/
void txstart()
{
mRs485G=send;
Tx_bit=transiting;
Tx_count=0;
SBUF=SENDSTART;
Tx_sum=SENDSTART;
}
/*----------------------------------------*/
void save_homemessage()
{
if(*(info_buffer+1)==ALLINFO)
{
lounumH=0;
lounumL=0;
infonumber=*(info_buffer+5);
}
else
{
lounumH=*(info_buffer+3);
lounumL=*(info_buffer+4);
infonumber=*(info_buffer+5);
}
}
/*----------------------------------------------------*/
/* Dec_Cem Rountine
DESCRIPTION:this rountine used to transfer a data from 10进制to 16进制
*/
/*-----------------------------------------------------*/
uchar Dec_Cem(uchar dec_data)
{
uchar data i,k;
i=dec_data;
k=dec_data;
i=i>>4;
i=i&0x0f;
k=k&0x0f;
k=i&0x0a+k;
return(k);
}
/*-------------------------------------------*/
/* 确认命令的实际意义
Description: 一共有几种方式:节能型没有下翻,03智能没有取消
返回数据0x0f 代表下翻, 0xf0代表上翻
返回数据0xaa 代表取消,0x55代表确认
0X00代表命令无效
*/
/*-------------------------------------------*/
uchar check_page_command()
{
if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==NEXTMSN))
{
Clr_Rx();
return (pagedown); //MEAN PAGE DOWN
}
else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==UPMSN))
{
Clr_Rx();
return( pageup); //MEAN PAGE UP
}
else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==CANCELMSN))
{
Clr_Rx();
return( cancel); //MEAN cancel
}
else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==DELMSN))
{
Clr_Rx();
return( delete); //MEAN cancel
}
else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==CONFIRMMSN))
{
Clr_Rx();
return( confirm); //MEAN PAGE UP
}
else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==EXTEXIT))
{
Clr_Rx();
return( exit); //MEAN PAGE UP
}
else
{
Clr_Rx();
return( 0x00);
}
}
/*------------------------------------------*/
/* 进入信息处理周期
描述:
进入前带来有关楼层信息:号码,户内形式,
进入后,通过纪录信息的情况变量 self_bigoffset,self_smalloffset; pub_bigoffset,pub_smalloffset;
以及wink_offset
*/
/*---------------------------------------------*/
void message_treat() /*返回应答*/
{
uchar data i;
answer_comm();
read_block=0x1000*(0X20*(Dec_Cem(lounumH)+Dec_Cem(lounumL-1)/0x10)+Dec_Cem(lounumL-1)%0x10); //房号<33..读编号x0x10,读信息初识地址x1000
address_pointer=read_block;
Count_Flash_Offset();
self_newscount=offset_biggest; //现在offset_biggest记录的是信息数量
self_smalloffset=offset_smallest; //现在已经修改,offset_smallest记录的是最小的位置
self_bigoffset=offset_biggestplace;
read_block=0x00000000;
Count_Flash_Offset();
pub_newscount=offset_biggest; //现在offset_biggest记录的是信息数量
pub_smalloffset=offset_smallest; //现在已经修改,offset_smallest记录的是最小的位置
pub_bigoffset=offset_biggestplace;
wink_offset=self_newscount+pub_newscount;
Clr_Display();
if(wink_offset==0)
{
No_Message_Guide();
}
else
{
disp_detail();
}
CNTRL=TRUE; //USED TO RELAY
init_timer2();
while((timeout2<0x3e8)&&EnWork_bit) //lookup message for 30s or home-user close,finished a cycle
{
if(Rx_bit)
{
i=check_page_command();
}
if(((self_newscount+pub_newscount)==0)&&(i==exit)) //NO MESSAGE,if push the spec key ,out the operation
{
EnWork_bit=FALSE;
i=0;
}
else if((i==pagedown)&&((self_newscount+pub_newscount)!=0))
{
if(wink_offset!=0)
{
wink_offset--;
if((self_newscount+pub_newscount-wink_offset)%rowcharacter==0) //换页
{
Clr_Display();
disp_detail();
disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
}
else
{
disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
}
}
else //到达最后,等待退出到上一层
{
Inqire_Frame();
i=0;
while((timeout2<0x3e8)&&(i!=pagedown)&&((i!=cancel)&&(kindBYTE==1)))
{
if(Rx_bit)
{
i=check_page_command();
}
}
Clr_Display();
wink_offset=self_newscount+pub_newscount;
disp_detail();
disp_color(0);
}
i=0;
}
else if((i==pageup)&&(self_newscount+pub_newscount!=0))
{
if(wink_offset==(self_newscount+pub_newscount)) //top of the detail
{
EnWork_bit=0;
}
else
{
wink_offset++;
if((self_newscount+pub_newscount-wink_offset)%rowcharacter==0) //换页
{
Clr_Display();
disp_detail();
disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
}
else
{
disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
}
}
i=0;
}
else if((i==exit)&&(self_newscount+pub_newscount!=0))
{
EnWork_bit=FALSE;
i=0;
}
else if((i==confirm)&&(self_newscount+pub_newscount!=0))
{
Clr_Display();
disp_main();
i=0;
while ((timeout2<0x3e8)&&(i!=pagedown)&&(i!=cancel))
{
if(Rx_bit)
{
i=check_page_command();
if(((i==cancel)&&(kindBYTE))||(i==pagedown))
{
Clr_Display();
Inqire_Frame();
}
}
}
i=0;
while ((timeout2<0x3e8)&&(i!=confirm)&&(i!=pageup))
{
if(Rx_bit)
{
i=check_page_command();
Clr_Display();
disp_detail();
}
}
i=0;
}
//------------------------------------------------------------------
else
{
i=0;
}
}
CNTRL=FALSE; //USED TO RELAY
clr_timer2();
Enwork_bit=0;
Clr_Display();
}
/*-----------------------------------------*/
void answer_comm() /*主机发数据到分机,填好数据,检测是否空闲,发出*/
{
uchar data m;
Tx_buffer[0]=MSNCMMD;
Tx_sum=Tx_sum+Tx_buffer[0];
if(kindBYTE)
{
Tx_buffer[1]=0xf0;
}
else
{
Tx_buffer[1]=0x00;
}
Tx_sum=Tx_sum+Tx_buffer[1];
Tx_buffer[2]=lounumH;
Tx_sum=Tx_sum+Tx_buffer[2];
Tx_buffer[3]=lounumL;
Tx_sum=Tx_sum+Tx_buffer[3];
Tx_buffer[4]=myaddr;
Tx_sum=Tx_sum+Tx_buffer[4];
Tx_buffer[5]=valid;
Tx_sum=Tx_sum+Tx_buffer[5];
for(m=6;m<11;m++)
{
Tx_buffer[m]=0;
}
if(Rxrun_bit)
{
delays60ms();
}
txstart();
delays60ms();
}
/*-------------------------------------------*/
/*
*/
/*-------------------------------------------*/
void RS_int() interrupt 4
{
unsigned char data Rxdata=0;
if(RI)
{
RI=0;
Rxdata=SBUF;
if(Rx_count==0)
{
init_timer0();
if((Rxdata==SENDSTART)||(Rxdata==RESEIVESTART))
{
*info_buffer=Rxdata;
Rx_count++;
Rx_sum=Rxdata;
Rxrun_bit=1;
}
}
else if((Rx_count==0x07)&&(Rx_sum==Rxdata))
{
if(*info_buffer==RESEIVESTART)
{
Rx_bit=1;
Rxrun_bit=0;
TR0=0; //not used T0 timer
}
}
else if((Rx_count==15)&&(Rx_sum==Rxdata))
{
if(*info_buffer==SENDSTART)
{
Rx_bit=1;
Rxrun_bit=0;
TR0=0; //not used T0 timer
}
}
else if(Rx_count>15)
{
if((Rx_count==(*(info_buffer+5)+6))&&(Rx_sum==Rxdata)&&(*info_buffer==SENDSTART))
{
Rx_bit=1;
Rxrun_bit=0;
TR0=0; //not used T0 timer
}
else if(Rx_count<(*(info_buffer+5)+6))
{
*(info_buffer+Rx_count)=Rxdata;
Rx_count++;
Rx_sum+=Rxdata;
}
else
{
if(!Rx_bit)
{
Clr_Rx();
}
}
}
else
{
*(info_buffer+Rx_count)=Rxdata;
Rx_count++;
Rx_sum+=Rxdata;
}
}
if(TI)
{
TI=0;
if(Tx_count<14)
{
SBUF=Tx_buffer[Tx_count];
Tx_sum=Tx_buffer[Tx_count]+Tx_sum;
Tx_count++;
}
else if(Tx_count==14)
{
SBUF=Tx_sum;
Tx_count++;
}
else
{
Tx_bit=0;
mRs485G=1;
Tx_count=0;
}
}
}
//这是备用功能,作为删除信息时候的功能
/*
else if(i==delete)
{
Clr_Display();
Inqire_Frame();
i=0;
while ((timeout2<0x2ee)&&(i!=confirm)&&(i!=cancel))
{
if(Rxrun_bit)
{
init_timer0();
}
if(Rx_bit)
{
i=check_page_command();
if(((i==cancel)&&(kindBYTE))||(i==pagedown))
{
Clr_Display();
Inqire_Frame();
}
}
}
i=0;
while((timeout2<0x2ee)&&(i!=confirm)&&(i!=pageup))
{
if(Rx_bit)
{
i=check_page_command();
Clr_Display();
disp_detail();
}
}
i=0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -