在利用51单片机学习嵌入式开发的过程中,通常会利用单片机串口进行字符或字符串的收发操作,博主最近在写一个小程序的过程中遇到了这样一个问题,在主函数内利用串口进行一个字符串的发送操作,并且对发送中断标志位进行置零或置一,此外,在串口中断函数内再次进行中断标志位的置零或置一操作,如下代码片段,该代码片段会阻塞程序的执行,类似于死循环,解决方法是去掉中断函数内对发送标志位相关操作代码片段,并且不在中断函数内进行数据的发送操作。
void main()
{
UARTInit(); //串口初始化
while(1)
{
TI = 1;
puts("大家好!欢迎学习单片机");
while(!TI);
TI = 0;
delay(1000);
}
}
/* UART中断服务函数 */
void InterruptUART() interrupt 4
{
EA = 0;
if(RI) //接收到字节
{
RI = 0; //手动清零接收中断标志位
RxdByte = SBUF; //接收到的数据保存到接收字节变量中
SBUF = RxdByte; //接收到的数据又直接发回
}
if(TI) //字节发送完毕
{
TI = 0; //手动清零发送中断标志位
}
EA = 1;
}