单片机发送一个数据,串口调试助手接收到两个,这是为什么呢?看代码

#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.

由于没写中断处理程序当发送完成后,触发串口中断进入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

这样就可以实现多个字节发送不会造成冲突追问

第一次发送完 TI不是已经是1了么?

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-10
因为开中断却没写中断程序,发送完进中断跳错回主函数再次发送,而产生的中断标志没清,所以两次追问

谢谢。

第2个回答  2013-11-10
你把EA和ES都等于零试试,,,,,
相似回答