📄 serial
字号:
#include <AT89X52.H>
#define UCHAR unsigned char
#define RLEN 4
UCHAR data r_buf[RLEN]; //串行接收缓存区的大小(非循环)
UCHAR r_in,check; //定义缓冲区的队列指针,校验指针
bit read_flag=0; //定义接收区取数标志位
bit rbuf_flag=0; //定义接收数据是否放入缓存区标志
void serial(void) interrupt 4
{
UCHAR ch;
RI=0;
ch=SBUF;
if(~rbuf_flag&ch==0x55)
{
rbuf_flag=1;
r_in=0;
}
if(rbuf_flag)
{
r_buf[r_in]=ch;
r_in=r_in++;
if(r_in==RLEN)
{
rbuf_flag=0;
read_flag=1;
r_in=0;
}
}
}
/******* 接收数据包有效函数*********/
bit valid(void)
{ UCHAR check=0x55;
UCHAR i;
if(read_flag&&r_buf[2]==slave)
{
for(i=0;i<3;i++)
{
check|=r_buf[i];
}
if(check==r_buf[3])
{return(1);
}
else return(0);
}
/*********数据打包发送程序*******/
viod packet(UCHAR c)
{UCHAR data *p,i,check;
check=0x55 | c | slave;
if(c==0xD8)
{
p=(&collectdata);
}
if(c==0x49)
runDog();
ctrl485=0; //置位485总线处于发送
for(i=0;i<1000;i++); //延时一会
SBUF=0xAA;
while(TI==0);
TI=0;
SBUF=c;
while(TI==0);
TI=0;
SBUF=slave;
while(TI==0);
TI=0;
if(c==0xD8)
{
p=(&collectdata);
for(i=0;i<9;i++)
{SBUF=*p;
check|=*p;
while(T==0);
T=0;
}
if(c==0x49){}
SBUF=check;
while(T==0);
T=0;
for(i=0;i<1000;i++); //延时一会
ctrl485=1; //置位485为接收状态
}
/********接受数据包处理函数*****/
viod Process(viod)
{ UCHAR data c;
UCHAR xdata *p;
if(valid())
{
swith(r_bluf[0])
{case 01:{c=0xD8;
packet(c);
}
break;
case 02:{c=r_bluf[2]; //c为开关位
runDog(); //喂狗
while(valid()); //等待接收命令为03的数据包
if(r_bluf[0]==0x03)
{p=0x1000;
/*对开关位的操作*/
packet(c);
}
break;
default: break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -