单片机发送一个数据,串口调试助手接收到两个,这是为什么呢?看代码
#include<reg52.h>voidinit_urat(void){TMOD=0x20;//定时器1为自动再装入8位计数器TH1=0xfd;TL1=0xfd;//波...
#include <reg52.h>
void init_urat(void){ TMOD = 0x20;//定时器1为自动再装入8位计数器 TH1 = 0xfd; TL1 = 0xfd;//波特率:9600bps TR1 = 1; //启动定时器1:波特率发生器
SM0 = 0; SM1 = 1; //方式1 10位异步收发器(1位起始位+8位数据+1位停止位) 波特率可变 REN = 1;//允许接收 TI = 0; //发送标志位 RI = 0; //接收标志位 EA = 1; //总中断
ES = 1; //串口中断
}void main(void){ init_urat(); SBUF = 'i'; while(1);
}
发送一个i,串口调试助手显示接收到两个ii. 展开
void init_urat(void){ TMOD = 0x20;//定时器1为自动再装入8位计数器 TH1 = 0xfd; TL1 = 0xfd;//波特率:9600bps TR1 = 1; //启动定时器1:波特率发生器
SM0 = 0; SM1 = 1; //方式1 10位异步收发器(1位起始位+8位数据+1位停止位) 波特率可变 REN = 1;//允许接收 TI = 0; //发送标志位 RI = 0; //接收标志位 EA = 1; //总中断
ES = 1; //串口中断
}void main(void){ init_urat(); SBUF = 'i'; while(1);
}
发送一个i,串口调试助手显示接收到两个ii. 展开
3个回答
展开全部
由于没写中断处理程序当发送完成后,触发串口中断进入0x0023地址处运行,就相当于复位了一次一样。所以会出现2次的情况。(第二次由于TI已经为1了所以不会触发中断)
解决方法
1、关闭串口中断
EA=0;
ES=0;
2、写一个串口中断处理函数
void UARTInterrupt(void) interrupt 4
{
if(RI)//RI标志位为1代表接收到数据
{
RI = 0 ;//清零接收标志位
//在这里添加中断处理函数
}
else
TI = 0;//如果RI不为1一般是发送完成中断 把TI(发送完成标志位)清零
}
发送完成后清零TI
SBUF = 'i';
while(!TI);//等待发送完成
TI = 0;//发送完成后清零TI
这样就可以实现多个字节发送不会造成冲突
解决方法
1、关闭串口中断
EA=0;
ES=0;
2、写一个串口中断处理函数
void UARTInterrupt(void) interrupt 4
{
if(RI)//RI标志位为1代表接收到数据
{
RI = 0 ;//清零接收标志位
//在这里添加中断处理函数
}
else
TI = 0;//如果RI不为1一般是发送完成中断 把TI(发送完成标志位)清零
}
发送完成后清零TI
SBUF = 'i';
while(!TI);//等待发送完成
TI = 0;//发送完成后清零TI
这样就可以实现多个字节发送不会造成冲突
追问
第一次发送完 TI不是已经是1了么?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询