OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5040|回复: 4

C51简单串口通信问题,谢谢大家

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-2-21
在线时间
0 小时
发表于 2019-2-21 14:19:10 | 显示全部楼层 |阅读模式
1金钱
2019-02-21_135454.png 2019-02-21_135516.png 有个关于C51串口通信的基础小问题,想问问各位大神,图片中的程序是通过串口调试助手将PC机中的数据传入51单片机,51再将该数据传回PC机。我有个疑问,就是我画红线部分,当51接收到数据产生接收完成中断,进入中断程序,保存接收到的数据,紧接着又发送该数据,发送完该数据,又产生发送完成中断,这时是跳进同一个中断程序,再执行一遍接收,保存,发送的流程吗?可是这个时候并没有接收到数据呀。请大家多多指教。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6681
金钱
6681
注册时间
2017-4-12
在线时间
1254 小时
发表于 2019-2-21 15:21:02 | 显示全部楼层
串口中断里,用
if(RI)  //判断接收中断
{
   RI=0;//清除中断标志
   ...
}
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-7-16
在线时间
10 小时
发表于 2019-2-22 09:12:39 | 显示全部楼层
调试结果对吗?
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-2-19
在线时间
14 小时
发表于 2019-2-27 21:56:58 | 显示全部楼层
本帖最后由 鬼王 于 2019-2-27 22:00 编辑

#include "STC15W4K.H"      // 包含 "STC15W4K.H"寄存器定义头文件
****************《51单片机轻松入门-基于STC15W4K系列》配套例程 *************
  淘宝店地址:https://shop117387413.taobao.com
  视频、课件、例程等下载地址:https://pan.baidu.com/s/1bURkE6  

unsigned  char num=0;           // 存放接收到的1个字节的数据
void UART_init(void)
{                  
        // 下面代码设置定时器2
        T2H  = 0xFD;        // 波特率:9600 /22.1184MHZ,1T
        T2L  = 0xC0;        // 波特率:9600 /22.1184MHZ,1T
        AUXR = 0x15;    // 0001 0101,T2R=1启动T2运行,T2x12=1,定时器2按1T计数,S1ST2=1
        // 下面代码设置定串口1
        SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)
        // 下面代码设置中断
        ES   = 1;                // 开串口1中断
        EA   = 1;                // 开总中断
}

void main()
{
        UART_init();
        while(1);
}  

void UART1(void) interrupt 4  // 串行口1中断函数
{
        if(TI)
        {
                TI = 0;                        
        }
        if(RI)
        {
                RI = 0;
                num = SBUF;
                num++;
                SBUF = num;           // 启动数据发送过程               
        }
}
书封面照片.JPG

回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2019-2-28 09:09:34 | 显示全部楼层
已经在串口中断函数时,这个时候中断源再次触发是被忽略的,只有等待中断函数执行完退出后,才能再次响应中断;
串口发送完成后,执行TI=0就是清除中断时间标记,所以发送中断正常是不会产生了。
最好还是使用
if(RI == 1)
{
RI = 0;

}
if(TI == 1)
{
TI = 0;

}
可以提高产品的稳定性,比如由于某种原因导致发送进入中断,你上面的代码逻辑就有问题了。
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 15:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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