不会定义这个sample_Liquid液位信息
#include <reg52.h>
#include <intrins.h> //包含头文件
union uint_uchar{
unsigned int Bint;
unsigned char Bchar[2];
}sample_num; //采样次数单元
unsigned char rev_statu; //接收状态单元
void sys_init(void)
{
/串行口初始化/
TMOD|=0x20; //定时器1工作在定时方式2
SCON=0x50; //串行口工作在方式1,允许接收
TH1=0xfd;
TL1=0xfd; //设定波特率为9600
TR1=1; //启动定时器1
ES=1; //开串口中断
EA=1; //总中断允许
}
void UART_ISR(void) interrupt 4
{
unsigned char temp;
if(RI==1)
{
RI=0;
temp=SBUF;
if((temp=='S')&&(rev_statu==0))
{
rev_statu=1; //准备接收'T'
}
else if((temp=='T')&&(rev_statu==1))
{
rev_statu=2; //准备接收'A'
}
else if((temp=='A')&&(rev_statu==2))
{
rev_statu=0; //接收到字符串“STA”
sample_num.Bint+=1; //采集次数单元加1
temp=sample_Liquid(); //采集液位信息
SBUF=0xff; //发送起始符
while(TI==0);
TI=0;
SBUF=temp; //发送液位数据
while(TI==0);
TI=0;
SBUF=sample_num.Bchar[0]; //发送采样次数
while(TI==0);
TI=0;
SBUF= sample_num.Bchar[1]; //发送采样次数
while(TI==0);
TI=0;
temp+=sample_num.Bchar[0]; //计算校验和
temp+=sample_num.Bchar[1];
SBUF=temp; //发送校验和
while(TI==0);
TI=0;
}
else
{
rev_statu=0; //返回准备重新接收
}
}
else if(TI==1) //若满足说明发送数据已完成
{TI=0;} //对于此任务可不写
}
void main(void)
{
sample_num.Bint=0;
sys_init();
while(1);
}
这个串口程序用串口助手调试发送STA返回12345即可
不建议在串口中断里进行发送。可以定义一个全局标志,当串口接收检测到STA后,设置这个全局标志。在主程序里检测到标志后,执行发送操作即可。
因为这个标志在中断里被更改,定义的时候别忘记加上volatile。