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

[复制链接]
12581|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的值,实现了。困扰我的问题解决了。呵呵)
wukunshan 发表于 2012-7-1 18:47 | 显示全部楼层
回三楼问题:没有办法人为去改变SBUF的值,只有被动等待数据进入SBUF后才能读取。
回复四楼问题:先定义一个变量,在中断代码里收到30就该变量加1,然后再判断变量的值,做出相应的动作。
 楼主| cgd 发表于 2012-7-1 20:05 | 显示全部楼层
5# wukunshan

多谢了,按照你的提示,问题解决了。
多谢!
chunk 发表于 2012-7-2 09:51 | 显示全部楼层
那个“CLR RI”不能利用一下吗?
sedatefire 发表于 2012-7-2 10:11 | 显示全部楼层
sbuf是串口移位器“量变引发质变”的结果,只读的,无法改变

为何会有这么“别扭的需求”,要三思哦
别扭的需求往往意味着“别扭的设计”
到后期常常带来严重的隐患
 楼主| cgd 发表于 2012-7-2 11:20 | 显示全部楼层
7# chunk

谢谢,通过判断RI,实现了自己想要的功能。
利用了 'CLR RI'
在此之前判断RI的值。
coody 发表于 2012-7-2 11:22 | 显示全部楼层
SBUF是双缓冲,读到的是串口接收的值。
 楼主| cgd 发表于 2012-7-2 11:25 | 显示全部楼层
8# sedatefire
8楼:
sbuf是串口移位器“量变引发质变”的结果,只读的,无法改变

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

主要是新手,对串口不熟悉的原因。
在 MOV A,SBUF 语句以后,判断A的值,
究竟是上一次发送的呢,还是新发送的。
“别扭的需求”,如果能清空或者设置接收SBUF就能实现此判断。
想一下,判断RI,就可以实现了。
 楼主| 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                                ;中断返回
sedatefire 发表于 2012-7-2 22:56 | 显示全部楼层
8# sedatefire  
8楼:
sbuf是串口移位器“量变引发质变”的结果,只读的,无法改变

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


看不大懂哦
我所说的别扭需求,指的是,为何有如此奇怪的需求?一定可以找到其他更为自然,更符合逻辑习惯的替代处理方式。
“我想实现的是在上位机发送一个字节的情况下,读取两次SBUF 。第一次是上位机发送的值,第二次是想让SBUF的值变为03”
 楼主| cgd 发表于 2012-7-3 08:54 | 显示全部楼层
本帖最后由 cgd 于 2012-7-3 09:00 编辑

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

本版积分规则

cgd
个人签名:

80

主题

7512

帖子

16

粉丝
快速回复 在线客服 返回列表 返回顶部