找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1147|回复: 9
打印 上一主题 下一主题
收起左侧

单片机新手入门,不太明白串口!帮忙解答,谢谢

[复制链接]
跳转到指定楼层
楼主
ID:511168 发表于 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的接收端多次重复第一个数据?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:352653 发表于 2020-3-6 23:26 | 只看该作者
不停在复位
回复

使用道具 举报

板凳
ID:235200 发表于 2020-3-7 01:49 | 只看该作者
这要看你的主程序是如何编写的,一个不完整的程序他人是无法给你正确的答案的
回复

使用道具 举报

地板
ID:213173 发表于 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,就会重复进入接收中断并重复回传第一个数据。
回复

使用道具 举报

5#
ID:437615 发表于 2020-3-7 08:29 来自手机 | 只看该作者
你那个括号后面少了个冒号,所以就和下面那一句组成了一个无限循环,
回复

使用道具 举报

6#
ID:633559 发表于 2020-3-7 09:02 | 只看该作者
while(!RI)      
RI=0;
//当RI=1时,跳出while循环。没分号的话,上面RI=0是在while内的指令。

while(!RI);
RI=0;
是不一样的
回复

使用道具 举报

7#
ID:703894 发表于 2020-3-7 09:29 | 只看该作者
这样加个冒号,你的循环写错了,和下一行作为一个循环了   
while(!RI);
    RI = 0;      //接收完成时,由软件复位
回复

使用道具 举报

8#
ID:420836 发表于 2020-3-7 09:49 | 只看该作者
软件复位, RI = 0;
循环条件不满足, while(!RI) 以及以下程序行不执行, 直接跳过
回复

使用道具 举报

9#
ID:679425 发表于 2020-3-7 09:52 | 只看该作者
组成了一个无限循环
回复

使用道具 举报

10#
ID:691449 发表于 2020-3-7 15:43 | 只看该作者
while(!RI) 后面少了一个分号,c语言分号表示空语句,如果没有分号,就会是下面一句在循环
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表