kscheang 发表于 2023-7-20 22:48 有可能是两者的速度不同(1T/12T)形成的差异。在中断和while(!TI); 之间谁先被执行。但你的原代码确实是违反逻辑的。就算表面正常工作但还是存有隐患的,如果发生随机莫名其妙的死机都很难查清原因。上述红色注释已经解释得很清楚了。 |
/******************************************************************** 发送一个字节 *********************************************************************/ void Send(uchar x) { RS485_DIR=1; //RS485先设置为发送 SBUF = x; //將x放入缓冲区 当程序运行到这里将触发串口中断,中断中TI被清0。等跳出串口中断再执行下面的while(!TI);, 就会永远死在这里。两个TI清0只能选一个使用! while(!TI); //如果还未发送完,不停发送 等待中断请求标志TI为1 TI=0; //发送完,中断请求,TI软件置0 RS485_DIR=0; //RS485设置为接收 } /******************************************************************** 发送接收中断函数 *********************************************************************/ void uart_isr() interrupt 4 { if( RI ) //如果接收到新字串 { RI = 0; //接收完. 中断请求, RI软件置0 dat = SBUF; //將接收缓冲区的值赋值给dat } if( TI ) TI = 0; //如果发送新字串, 发送完,中断请求,TI软件置0 } |