上节咱们说到,我们已经可以实现两个单片机之前通讯了,这次我们就需要来研究一下,他们之间到底说了些什么,以及他们之间是怎么说的?以下所有内容和说明的类比对象,都以串口(Usart 为例子,以串口机制来讲解传输的原理,然后推广到其他方面的传输接口)。
首先,还记得我们之前说的两个单片机之间通讯是通过单片机 A 的 Tx 和单片机 B 的 Rx 连接在一起的,然后进行的数据传输。那么,我们就想一下,这两个单片机,一个是小明,一个是小红。他们如何通过一个手电筒来进行信息传递的。
-
首先,我想问问大家,还记得我们单片机的引脚可以干嘛的吗?对了,就是可以控制外部输出,你想想一下,比如小明的 Tx 引脚输出高电平,那么如果小红的 Rx 引脚此时处于接受状态的话是不是就可以收到一个高电平?当然是可以的。那么小明就做到了给小红传输一个高低的信号(也就是所说的 0 或则 1)。如果小红和小明之间规定 0 代表关门, 1代表开门。那么小红在收到小明的指令后,就会按照事先的规定按步执行了。
-
有没有感觉一根线上只是传输了一个 0 或则 1 有点浪费?这确实浪费了,那么好了,想象一下,一个字节是多少位的?1byte = 8bit。一个字节是 8 位。有没有什么办法,直接将一个字节在这根线上传输呢?也就是说,小明这边传输一个 8 bit 数据,而小红那边接受一个 8 bit 数据呢?(有人会想:每次传输 1 位,传输 8 次,这样全部信息不就传输过去了???)大方向是这样的,但是有所欠缺,下面我就详细的给大家讲解一下,为什么有缺陷。
- 比如,小明在传输完成 8 bit 数据之后小红按照指令去把风扇打开了,可是小明突然感觉到冷想让小红再把风扇关掉。可惜小红正在认真听讲没有注意小明又给她传输信息。结果他们就错过了彼此。小明也随即冻死在了教室里。针对这个矛盾点,我们可以让小明在要传输的时候先叫一声,“小红,我要开始装逼了,你快看过来。”这也就是我们常说的:起始标志(或则起始码,起始位。。。)。它在此的作用也就预示着一段信息传输即将开始。有开始当然也需要结束啦,有始有终才是一个合格的男孩子嘛。就这样,小明在传输完成之后也会在末尾增加一个停止位。这样小红就知道什么时候需要看着小明那边来等待小明传输的信息。
- 其实 8bit 数据包里面还有部分需要注意的地方,比如两个相邻的低电平是如何区分的,比如小明连续传送了两次低电平,小红如何区分?这其实得益于小红和小明各自的手表(也就是串口规定的通讯波特率)。比如小明每个发送的状态都持续 1s 。小红每次观察小明发过来的信息只持续 1s。超过 1s 就算到了下一个 bit 上。
- 以上几点说明简化如下:开始位 + 数据位 + 停止位 == 1字节传输结构。
现在我们实现了小明给小红传输 8bit 的数据。这也就是单片机之间交流的最小单元(1字节)。那么有人会问,8bit 的数据最多可以包含 256 种情况,如果我们传输的可能状态是 10000 种,那该怎么办呢?(那我们传输两次就好啦,一次一个字节,两次就是两个字节,这样直接就传输了一个 16bit 的信息,那么最多包含 65536 种状态了)。为什么不是 16bit 添加开头和结尾这种模式传输呢?因为我们 51 单片机是一个 8 位机,每次只能处理 8 bit 的数据。所以得分两次发送,通过程序逻辑来处理两次的数据。
你可以任意规定两个单片机传输一个字节代表什么含义,比如传输:一个字节为:0x12代表开风扇,0x22代表关风扇。。。等等等等!!!而外国棒子就将1个字节编码成了对应的字符信息形成了 ascii 码的“密码表”。比如 0x30 代表字符“0”,0x31代表字符“1”。这里不了解也没关系,我们后面还会继续详细说明,在此只是点一下。这就好像 apple = 苹果。它们只是中国人和外国佬对于苹果这个东西的一种称呼。ascii 码0x30 是计算机对于看到的符号 “0” 的叫法,而 零 是我们的叫法。