打印

关于51串口通信寄存器sbuf的疑问?

[复制链接]
11664|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cgd|  楼主 | 2012-7-1 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cgd 于 2012-7-1 11:43 编辑

clr es                            ;禁止串行中断
mov a ,sbuf                ;从缓冲区取出数据,用来判断是否停止发送。
clr ri                           ;清除接收标志位
cjne a,#00h,Loop        ;接收到非00,则转移。
setb es                           ;允许串行中断
reti                                ;中断返回

以上为程序的一部分,用来判断接收到的数据。如果接收的数据是00,则中断返回,此功能没有问题。
为非00的时候,转移到别处执行另外的功能。
问题:上位机只发送一次数据“30”,第一次读取sbuf的时候若为30,在第二次读取的时候仍然是30。我想实现第一次读取sbuf的时候为30,在第二次执行此程序的时候sbuf是03。
在上位机只发送一次30的情况下,能不能实现呢?

相关帖子

沙发
wukunshan| | 2012-7-1 13:36 | 只看该作者
楼主的意思是,上位机发送一个数据,你要两次读BUFF,而且第二次读取时让高四位和低四位颠倒过来?或者是
上位机发送两个数据,第一次读取BUFF的数据是上位机发送的数据,而第二次读取的是第一个数据的高四位和低四位颠倒过来?

使用特权

评论回复
板凳
cgd|  楼主 | 2012-7-1 15:15 | 只看该作者
2# wukunshan

不是这个意思,可能我没有表达清楚。

我想实现的是在上位机发送一个字节的情况下,读取两次SBUF 。第一次是上位机发送的值,第二次是想让SBUF的值变为03。

除了上位机发送03,让接收SBUF 变为03外,还有什么方法改变接收SBUF的值吗?

使用特权

评论回复
地板
cgd|  楼主 | 2012-7-1 15:38 | 只看该作者
本帖最后由 cgd 于 2012-7-2 11:30 编辑

或者这样说,上位机发送了“30”,在循环中执行上面的程序,读取N次接收SBUF。
单片机怎么样判断是发送了一次“30”,还是N次?
如果能做出判断,也可以实现我所要的功能。因为要在循环中不断的检测SBUF的值,做出不同的动作。

(刚才通过判断RI的值,实现了。困扰我的问题解决了。呵呵)

使用特权

评论回复
5
wukunshan| | 2012-7-1 18:47 | 只看该作者
回三楼问题:没有办法人为去改变SBUF的值,只有被动等待数据进入SBUF后才能读取。
回复四楼问题:先定义一个变量,在中断代码里收到30就该变量加1,然后再判断变量的值,做出相应的动作。

使用特权

评论回复
6
cgd|  楼主 | 2012-7-1 20:05 | 只看该作者
5# wukunshan

多谢了,按照你的提示,问题解决了。
多谢!

使用特权

评论回复
7
chunk| | 2012-7-2 09:51 | 只看该作者
那个“CLR RI”不能利用一下吗?

使用特权

评论回复
8
sedatefire| | 2012-7-2 10:11 | 只看该作者
sbuf是串口移位器“量变引发质变”的结果,只读的,无法改变

为何会有这么“别扭的需求”,要三思哦
别扭的需求往往意味着“别扭的设计”
到后期常常带来严重的隐患

使用特权

评论回复
9
cgd|  楼主 | 2012-7-2 11:20 | 只看该作者
7# chunk

谢谢,通过判断RI,实现了自己想要的功能。
利用了 'CLR RI'
在此之前判断RI的值。

使用特权

评论回复
10
coody| | 2012-7-2 11:22 | 只看该作者
SBUF是双缓冲,读到的是串口接收的值。

使用特权

评论回复
11
cgd|  楼主 | 2012-7-2 11:25 | 只看该作者
8# sedatefire
8楼:
sbuf是串口移位器“量变引发质变”的结果,只读的,无法改变

为何会有这么“别扭的需求”,要三思哦
别扭的需求往往意味着“别扭的设计”
到后期常常带来严重的隐患

主要是新手,对串口不熟悉的原因。
在 MOV A,SBUF 语句以后,判断A的值,
究竟是上一次发送的呢,还是新发送的。
“别扭的需求”,如果能清空或者设置接收SBUF就能实现此判断。
想一下,判断RI,就可以实现了。

使用特权

评论回复
12
cgd|  楼主 | 2012-7-2 11:27 | 只看该作者
本帖最后由 cgd 于 2012-7-2 11:32 编辑

clr es                            ;禁止串行中断
mov a ,sbuf                ;从缓冲区取出数据,用来判断是否停止发送。
JNZB RI,LOOP1           ;增加此语句,实现了想要的功能,不用“别扭的需求”
clr ri                           ;清除接收标志位
cjne a,#00h,Loop        ;接收到非00,则转移。
setb es                           ;允许串行中断
reti                                ;中断返回

使用特权

评论回复
13
sedatefire| | 2012-7-2 22:56 | 只看该作者
8# sedatefire  
8楼:
sbuf是串口移位器“量变引发质变”的结果,只读的,无法改变

为何会有这么“别扭的需求”,要三思哦
别扭的需求往往意味着“别扭的设计”
到后期常常带来严重的隐患
主要是新手,对串口不 ...
cgd 发表于 2012-7-2 11:25


看不大懂哦
我所说的别扭需求,指的是,为何有如此奇怪的需求?一定可以找到其他更为自然,更符合逻辑习惯的替代处理方式。
“我想实现的是在上位机发送一个字节的情况下,读取两次SBUF 。第一次是上位机发送的值,第二次是想让SBUF的值变为03”

使用特权

评论回复
14
cgd|  楼主 | 2012-7-3 08:54 | 只看该作者
本帖最后由 cgd 于 2012-7-3 09:00 编辑

13# sedatefire
我所说的别扭需求,指的是,为何有如此奇怪的需求?一定可以找到其他更为自然,更符合逻辑习惯的替代处理方式。
“我想实现的是在上位机发送一个字节的情况下,读取两次SBUF 。第一次是上位机发送的值,第二次是想让SBUF的值变为03”
因为每个循环都要读取SBUF的值,上位机不会发“03”,如果读取的是“03”的话,就可以判断不是上位机发送的,然后判断执行另外的分支程序。这是当时的初级想法。
由于当时思路不对,对串口中断没有理解好。仔细看下资料,现在判断 RI 的值,就可以判断是否为上位机发送的了。
判断 RI 的值,应该是符合逻辑习惯的方式吧?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

cgd
个人签名:

80

主题

7506

帖子

16

粉丝