30029|14

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

51串口通信(双51通信),关于SM2位的疑问 [复制链接]

做这个 双机通信(串行口工作于方式1) 的实验很不顺,之前参照课本的例程,直接想传三个数据,但是,不成功。(具体的细节忘了,明天重做。)

 

卡了一阵子,昨天开始继续捡起来,决定先从 一个数据 的传输开始。

 

因为之前三个数据传输的失败,我回头仔细地把课本相关的内容重新看了一遍,并且在网上找相关的资料看,不过看到的内容跟课本大同小异。除了一个地方,在接收机程序中,关于SM2的设置。

(发送机程序基本上就是一个MOV SBUF,A的问题,没什么太大问题,至少是 传输单个数据 的情况下。)

 

课本上是把SM2设置成0.

但是我在网上看到有人把它设置为1,我回头翻书,翻到一个这样的表格:

 

                     激活RI的条件

SM2  RB8

   1      0      不激活RI,不引起中断;

   0      0          

   0      1      (以下三个情况都激活RI,引起中断)

   1      1

 

这里,有一个疑问:所谓激活 RI 是什么意思呢?是指置RI=1吗?还是什么别的意思,但从后面说的引起中断来看,应该是把RI置为1,否则怎么引起中断?

 

然后,有点奇怪的是,虽然说RB8是接收到的结束位是1,但是,从上述表格中来看,只有SM2为1,RI才对RB8的状态有影响,但是为什么,要把SM2置为0呢?

我试过,在单数据传输情况下,SM2为0为1,没有什么不同。

 

我继续翻书,看到关于SM2有这样两句话:

1  在方式1时,若SM2=1,则只有接收到有效的停止位时,才能置位RI;

2  方式1中,若SM2=0,(既不是多机通信情况),则RB8中存放的是已接收到的停止位,方式0中未使用。

-----------------------------------------------

以上是书上的原话,是我们任课老师自己编写的。

ISBN:7-5025-8024-7

分别在第110和111页。

 

在这里,同样有几个疑问:

1 第二句话中,说的 “已接收到的停止位”,这里说的是上一次传输剩下的?还是说本次传输完毕后接收到的?

(也许你觉得我有点咬文嚼字,但是,我是基于以下的考虑才这样问的:)

如果说,这个“已接收到的”是指本次传输的停止位,那么,它和SM2=1有什么区别——不都是要等待 停止位 到来才置位RI么?

 

而从另一个角度看,如果说这个 已接收到 是指上一次传输留下的停止位,那么就有这样一个问题:

第二个数据传输开始,RB8一直是1,那它岂不是从一开始,数据还没传完,甚至还没开始传,RI就已经是1了么?

这样的话,第二个数据永远没可能安全接收到,因为RI=1。

 

针对这个问题,我想了一个小小的方法做一下实验。

我的思路就是上面说的“另一个角度出发”去做:我一开始就把RB8设为1(因为我只传输一个数据。)

看代码吧,代码很短,意思很明显:

  

  ORG   0100H
 START:
//设置相同的波特率;
       MOV   TMOD,   #20H;
       MOV   TL1,    #0E8H;
       MOV   TH1,    #0E8H;
       SETB  TR1;
//串行口设置(尝试SM2=0,RB8=1,观察它对RB8的影响);
       MOV   SCON,   #74H;
//等待接收完毕;
  NEXT:JNB   RI,     NEXT;
      
       MOV   A,      SBUF;
       MOV   P1,     A;
       SJMP  $;
       END

但是,我烧完程序,发现,跟我预想的不一样,数据还是正确安全地传输过去了——无论SM2是0还是1;

于是我就想,会不会是,当我启动一次接受,RB8会自动恢复为0,直到接收完毕,接受停止位?

——否则,上面这个程序,理应在没接收完毕,就RI置1的。

(写到这里的时候,我甚至很无端地怀疑SBUF是保留了之前的数据——其实是不可能的,一启动早就清零了,但我还是重新改了一个发送的数据,重新发送,还真是没问题,数据还是正确地传过去了。)

 

这个问题,掺和了好一阵子,到了这一步,虽然说,单个数据的传输已经 实现,但是,SM2和RB8的这个问题始终没想清楚。

只好发帖求救了。请各位有经验的大大谈一下。

 

[ 本帖最后由 辛昕 于 2011-8-18 00:40 编辑 ]

多个数据传输.rar

12.89 KB, 下载次数: 18

此帖出自51单片机论坛

最新回复

严谨点   是串行通信!  详情 回复 发表于 2011-3-22 15:29
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

277

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
51好久不用了,也忘差不多了,不好多说什么,只提供一些参考性的东西。
一般来说,做通讯,要注意一般基本设置,象波特率、起始位、停止位、校验位等,双方要设置一致,然后就是双机分别和PC通讯,确保双机都发送、接收正常,最后后再双机互联。
推荐接收采用中断方式。
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 

回复 沙发 thtlj 的帖子

谢谢你,这个问题昨天和今天琢磨了一下,似乎弄明白了一些。
今天做的多个数据传输也已经成功——开始传输两个数据完全没问题,后来想修改传多几个,但是,由于条件写错,JNC和JC的区别,一时糊涂了,不过现在也想明白了,明天修改再试试。
届时会仔细梳理一下思路,在此贴出。
让大家瞧瞧,如果还有错,请指教,如果对的话,也算是一个分享。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

4
 
不喜欢看汇编程序;P
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

5
 
诶,很悲催耶。
昨天傍晚,传两三个数据的 双机通信 搞定了,后来觉得想修改一下,传多几个,,,,结果不知为什么,改来改去,就是不行,郁闷死了。
刚才很郁闷地把之前做的程序干脆删除了,决定从头到尾写多一对收发程序。

-----现在我只希望昨天傍晚我不是幻觉。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2万

帖子

74

TA的资源

管理员

6
 

回复 5楼 辛昕 的帖子

加油啦 期待你的最新进展
此帖出自51单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

7
 
额,谢谢琳子姐,,哈哈,已经搞定了,琳子姐第一个知道的。

额,首先说明一下。
这次果然是犯小白的弱智的错误。
问题不在接收机,在于发送机,由于疏忽,实际上我从来只传出一个数据,所以当然没法完成。。。。。

关于这个SM2位,我要说一下的是,对于方式1,它是1是0,问题不太大。
对RB8也似乎没有什么影响,至少我改了,都不影响正确的传输。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1万

帖子

16

TA的资源

版主

8
 

用模拟串口也可的,不一定用那个位,反正我没用过,我也没见谁用过

此帖出自51单片机论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

1583

帖子

0

TA的资源

五彩晶圆(高级)

9
 
这个SM2对于方式1来说没什么影响,它影响的主要是方式2和方式3。
方式1中,一帧信息为10位,1位起始位(0,就是由1向0跳变),8位数据位和1位停止位。

在接收端有这么一句话说明:
在方式1中,当检测存在由1到0的变化时,即认为收到一个字符的起始位,接收过程随即开始。在接收移位脉冲的控制下,把接收到的数据一位一位地移入接收移位寄存器,直到9位数据(包括1位停止位)全部收齐。
在9位数据收齐之后,还必须同时满足以下两个条件,这次接收才被真正确认:
1、RI=0
2、SM2=0或接收到的停止位为1。
当满足这两个条件时,便将接收移位寄存器中的8位数据存入串口数据缓冲器SBUF,收到的停止位则进入RB8,并使接收中断标志RI置1。

上面是原书所写的。现在我来解释SM2为什么对方式1没有影响:因为影响是否能够产生中断的两个条件是
1、RI=0
2、SM2=0或接收到的停止位为1。
第一种因素我们在这里就忽略掉它,因为RI=1这种情况是发生在超速发送的情况下,就是前面的数据还没有处理完成,而下一个数据又已经移位接收完成。
第二种因素的关键是停止位,也就是第9位。方式1中第9位是停止位,所以永远是1。所以无论SM2=0或1都会引起RI置位。或者我们再展开来:
注意!!!!方式1中第9位是停止位,所以永远是1(速度不一样另谈)。
SM2=0,  第9位=0     RI不置位,
SM2=0,第9位=1    RI置位,
SM2=1,第9位=1    RI置位,
SM2=1,第9位=0    RI不置位。


那么,我们下面再来谈如何使用SM2来进行多机(方式2和3)通信的:
在方式2和方式3中,一个数据帧信息是由11位组成的,1个起始位,8位数据位,1个可编程位(第9位)和一个停止位。(这里要注意一下,方式1的停止位是第10位,而在这里停止位是第11位。)
开始时所有的子机SM2=1,主机开始发送呼号:以呼号编码(8位数据)+第9位为1的数据。然后所有的子机收到数据后都会产生中断(SM2=1,第9位=1,查对上面所列的表)。在跟自己的呼号比对后,对不上号的子机都无动作,只有对上号的子机把SM2设为0(SM2=0)。接下来主机发送数据了,数据的格式变为:8位数据+第9位为0。这样,只有SM2=0的子机会产生中断(2、SM2=0或接收到的停止位为1。),而其它的子机因为SM2=1而数据的第9位为0所以不会引起中断(RI不置位)。

[ 本帖最后由 huchuan987 于 2010-6-11 23:12 编辑 ]
此帖出自51单片机论坛

赞赏

1

查看全部赞赏

 
个人签名
 
 

回复

1583

帖子

0

TA的资源

五彩晶圆(高级)

10
 
忘了,还有一点,有些单片机RB8是只能读不能写的,即使你使用指令对它进行写操作它也不会改变,我不敢确定51是不是这样子,请高手指正
此帖出自51单片机论坛
 
个人签名
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

11
 
对于51单片机的串口通信,我觉得使用双机通信或者多机通信,最好还是采用协议比较好。我用过SM2设置的通讯,但是还是觉得不如使用通讯协议来判断主机从机比较方便。
此帖出自51单片机论坛
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

12
 
协议?什么协议,不是 串口协议么?
这个SM2貌似,至少对于双机通信不起什么作用啊?
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
有完成多机通信吗?   在宿舍调  没有示波器  悲催呀     用485的
此帖出自51单片机论坛
 
 
 

回复

289

帖子

0

TA的资源

一粒金砂(中级)

14
 
串口通信的协议可以自己定义的!
此帖出自51单片机论坛
 
个人签名科学家研究已有的世界,工程师创造未来的世界!
 
 

回复

289

帖子

0

TA的资源

一粒金砂(中级)

15
 
严谨点   是串行通信!
此帖出自51单片机论坛
 
个人签名科学家研究已有的世界,工程师创造未来的世界!
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表