标题: 单片机新手入门,不太明白串口!帮忙解答,谢谢 [打印本页]

作者: SXP210624    时间: 2020-3-6 20:39
标题: 单片机新手入门,不太明白串口!帮忙解答,谢谢
晶振:11.0592M  波特率:9600B/s  波特率发生器:定时器1(8位自动装载)  芯片:STC89C52
串口通信中断程序:void SerialPort_breakoff() interrupt 4{
    uchar date = 0;
    date = SBUF;
    //while(!RI)
    RI = 0;      //接收完成时,由软件复位
    SBUF = date;
    while(!TI);
    TI = 0;      //发送完成时,由软件复位
}
若要把“//while(!RI)”改成while(!RI)。为什么PC发送一个数据后,无法发送第二个数据;并且同时PC的接收端多次重复第一个数据?



作者: huang123456789    时间: 2020-3-6 23:26
不停在复位
作者: csmyldl    时间: 2020-3-7 01:49
这要看你的主程序是如何编写的,一个不完整的程序他人是无法给你正确的答案的
作者: wulin    时间: 2020-3-7 08:23
在这里while(!RI)就是一赘句,必须去掉。因为只有RI=1才能使CPU响应串口接收中断,不需要再次判断。可在接收中断中直接软件复位RI=0;。
如果非得画蛇添足加while(!RI)则必须加分号while(!RI);,否则RI永远无法清0。
不加分号语句含义就成
        while(!RI)//此时RI=1,!RI就是为假,无循环条件,不执行花括号内容,直接跳过。
        {
                RI = 0;  
        }   
所以接收中断结束后RI还是1,就会重复进入接收中断并重复回传第一个数据。
作者: zhy123654    时间: 2020-3-7 08:29
你那个括号后面少了个冒号,所以就和下面那一句组成了一个无限循环,
作者: 想进步要学习    时间: 2020-3-7 09:02
while(!RI)      
RI=0;
//当RI=1时,跳出while循环。没分号的话,上面RI=0是在while内的指令。

while(!RI);
RI=0;
是不一样的
作者: yyh_sd    时间: 2020-3-7 09:29
这样加个冒号,你的循环写错了,和下一行作为一个循环了   
while(!RI);
    RI = 0;      //接收完成时,由软件复位
作者: TTQ001    时间: 2020-3-7 09:49
软件复位, RI = 0;
循环条件不满足, while(!RI) 以及以下程序行不执行, 直接跳过
作者: haierzaifei11    时间: 2020-3-7 09:52
组成了一个无限循环
作者: xianming    时间: 2020-3-7 15:43
while(!RI) 后面少了一个分号,c语言分号表示空语句,如果没有分号,就会是下面一句在循环




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1