矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3800|回复: 20

求助,关于C51单片机串口接收

[复制链接]
     
发表于 2021-4-27 19:33:46 | 显示全部楼层 |阅读模式
本帖最后由 Fireflying 于 2021-4-27 20:30 编辑

想搞个STC自动下载器,用一枚STC的单片机检测STC-ISP发送的下载特征字符“0x7F”,达到设置的数量30,就执行复位。
网上查到一段程序如下:
  1. void uart1_ser() interrupt 4
  2. {
  3.                 RI=0;        //清空接收标志位
  4.                 if(SBUF==0x7f)  //STC下载指令0X7F
  5.                 {
  6.                                 uart_ser_n++;   //判断位自加
  7.                                 if(uart_ser_n==30) //如果收到30次0X7F
  8.                                 {
  9.                                                 uart_ser_n=0;   //判断位清0
  10.                                                 IAP_CONTR=0x60;//复位命令  
  11.                                 }
  12.                 }
  13.                 else
  14.                 {
  15.                                 uart_ser_n=0;       
  16.                 }
  17. }
复制代码


我现在对标志位RI和接收缓冲区SBUF的具体工作逻辑有点搞不清楚。
比方说我在电脑上的STC-ISP点击了下载按钮,这个软件会向目标单片机连续发送“0X7F”,在目标单片机上我清不清RI标志位,结果有啥不同?是清了RI位之后,SBUF里面才腾空,然后新的数据才能塞进来?还是说RI清不清,SBUF里面的数据都是在持续更新的?

表面上,从这段程序上看,它是先把RI清零了,然后判断SBUF接收缓冲区里面的数据是不是“0x7F”,如果是,就把计数变量加1,加了1之后再次判断,如果还是“0x7F”,就再次加1,一直加到30,然后执行软复位命令。如果计数变量还没有加到30,发现SBUF里面收到的数据不是“0x7F”了,那就把计数变量清零,重新开始计数。

我问RI和SBUF逻辑的原因是:如果只在开头把RI清零一次,电脑那边一直在发送数据,SBUF里面的数据还会不会更新?还是需要每读一次SBUF就把RI清零一次,新的数据才能更新进来?
     
发表于 2021-4-27 20:30:45 | 显示全部楼层
每次进入都RI=0,此时BUF里就有接收到的字符。每接收一个字符中断一次。不清空RI刚一出去就又中断进来了,那就没完没了地中断进入。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-4-28 07:41:19 来自手机 | 显示全部楼层
w6955 发表于 2021-4-27 20:30
每次进入都RI=0,此时BUF里就有接收到的字符。每接收一个字符中断一次。不清空RI刚一出去就又中断进来了,那 ...

没怎么看明白您说的啥意思。
我现在的疑惑是:像这段程序这样,只是在开头清一下RI,电脑端一直在持续发送数据,这边第一次当然是收到数据了,第二次及以后呢?SBUF里面的数据会更新么?您的意思是说这段程序它会执行一轮跳出中断后再次进来?我没看到它再次进来的触发逻辑是啥。
为什么不能每接收读取一次,就清一次RI?因为,我觉得,如果不是每次清RI的话,会不会SBUF里面还是上次的旧数据没变?
回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 07:52:17 | 显示全部楼层
Fireflying 发表于 2021-4-28 07:41
没怎么看明白您说的啥意思。
我现在的疑惑是:像这段程序这样,只是在开头清一下RI,电脑端一直在持续发 ...

绝对不会,因为这个是中断处理程序,每次来了信息才会发出中断信号,程序转去处理这个中断,没有新的信息进来怎么会有中断发生?总的说是这样:RS232总是在接受状态,信息来了就会接收,接收后向CPU发出中断请求,CPU转过来处理这个中断,进入清除掉中断的标志RI读取BUF,处理后CPU退出中断程序回到断点继续执行原来的程序语句下面的部分。再有信息进来,再次重复这个过程。对通讯口而言CPU还是很快的。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-4-28 09:32:44 来自手机 | 显示全部楼层
w6955 发表于 2021-4-28 07:52
绝对不会,因为这个是中断处理程序,每次来了信息才会发出中断信号,程序转去处理这个中断,没有新的信息 ...

大概明白了,另外还有一个细节请教一下:
RI是硬件自动置位的,需要软件清零复位,咱先抛开中断不说,如果不用中断,串口收到数据后RI被置位,此时如果不执行清零复位,SBUF里面的数据还会随着新数据进来更新内容吗?

首贴的那段程序,是不是因为CPU足够快,每次收到数据都会产生中断然后清零置位RI,为下一轮读数据做准备?倘若去掉RI=0那一行,程序是不是就没法正常工作了?
回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 10:15:54 来自手机 | 显示全部楼层
对51C编程不懂,
回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 10:29:48 来自手机 | 显示全部楼层
对51C编程不懂,只会一点点汇编,也只能从文字描述判断 USART由硬件置1,软件清0,只要串口允许收接使能,无论是否开启接收中断,单片机都会响应接收,如果没有及时读取缓冲器SBUF内容就会发生溢出错误,导致接收内容混乱。 如果串口允许接收使能并开启中断,而且,上位机在不断的发送数据,但在服务中断里没有清零RI位,将会进入接收中断死循环。 仅供参考,楼下续继。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 10:42:15 来自手机 | 显示全部楼层
用手机回贴为什么内容被分成两页?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-4-28 10:58:47 | 显示全部楼层
mov99 发表于 2021-4-28 10:29
对51C编程不懂,只会一点点汇编,也只能从文字描述判断 USART由硬件置1,软件清0,只要串口允许收接使能, ...


REN串口允许接受已经置于1,允许串口接收了。
我现在就是没搞明白RI跟SBUF之间的关系,复位RI的意义在哪里?上位机在持续发送数据过来,SBUF里面的数据是随时更新的么?跟RI有没有关系?
理想状态,接收完成了,RI被硬件置位,软件在读取了SBUF之后就把RI复位,进入下一轮接收读取过程。那么,假如RI没有被及时复位,会产生怎样的结果?
回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 11:06:59 | 显示全部楼层
https://item.taobao.com/item.htm ... 1&_u=supgfq3933

自动下载器已有成品。   配合烧写软件。   每次编译自动下载烧写。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-4-28 11:13:22 | 显示全部楼层
IRF540 发表于 2021-4-28 11:06
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.6a172e8dXSfgYV&id=560561974941&_u=supgfq3933

自 ...

我是要学习编程,不是缺下载器。
回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 14:00:26 | 显示全部楼层
本帖最后由 mov99 于 2021-4-28 14:27 编辑
Fireflying 发表于 2021-4-28 10:58
REN串口允许接受已经置于1,允许串口接收了。
我现在就是没搞明白RI跟SBUF之间的关系,复位RI的意义在 ...


当SBUF接收满8位(额外还有起如位和停止位),RI位由硬件置1,不清零RI位SBUF一样可接收。如果串口允许、接收使能、开启接收中断,而且,上位机在持续发送数据,但在服务中断里没有清零RI位,将会进入接收中断死循环;或者说,CPU响应了接收中断,因没有清零RI位,当执行返回断点指令后,CPU马上立刻再次响应中断,周而复始,也就是接收中断死循环。另外,服务中断的代码越小越好,不要在中断内加延时或调用其它子程序。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-4-28 15:11:39 | 显示全部楼层
mov99 发表于 2021-4-28 14:00
当SBUF接收满8位(额外还有起如位和停止位),RI位由硬件置1,不清零RI位SBUF一样可接收。如果串口允许、 ...

好的,知道了。谢谢解惑!
回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 16:54:46 | 显示全部楼层
Fireflying 发表于 2021-4-28 15:11
好的,知道了。谢谢解惑!


不客气,共同探讨
如果未及时读SBUF内容,可能导致祯错或溢出错。
DIY是享受制做的过程和成功的喜悦,想DIY下载线不用读0x7F,查询CH340的RTS#引脚为低电平时,把待写芯片断电稍延时再上电(冷启动),一样可以下载代码。

补充内容 (2021-4-28 19:19):
如果读0x7F判断是否连接,控制单片机和待烧写单片机要共用USART总线,PCB布线好像用点麻烦,用查询RST#引脚的方法可组可分,一片8引脚的STC15W104用内部振荡器就可搞定
回复 支持 反对

使用道具 举报

     
发表于 2021-4-28 17:18:20 | 显示全部楼层
Fireflying 发表于 2021-4-28 10:58
REN串口允许接受已经置于1,允许串口接收了。
我现在就是没搞明白RI跟SBUF之间的关系,复位RI的意义在 ...

你把这句屏蔽掉,试试就知道了,应该是无休止的进出这个中断。不发字符正常,一发字符立刻死循环。试试嘛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-27 12:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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