在讲串口通讯之前,我们先来讲一讲通讯的概念吧,因为我想让大家知道通讯的本质是什么,只有在你知道了通讯的本质之后,你才能在学习通讯的大路上顺风顺水。
所以呢,你们要认真看完我为你们精心编制的小故事,看完之后,你会对现在的通讯有一个更加深刻的理解。
烽火台
在遥远的古代,没有手机、电脑这样的通讯工具,更没有汽车、飞机之类的交通工具,那么如果有敌人来攻城的话,如何快速传递把信息传递给千里之外的兵营呢?
答案想必大家都知道,那就是烽火台!
而且是每隔数里建设一个烽火台,等有敌人来犯就点燃烟草,烽烟会在短时间内传到千里之外的兵营。
我们暂且称它为烽烟通讯,它的通讯原理很简单,有烽烟的情况就代表着有敌人来犯,如果没有烽烟就代表一切正常,它只会出现两种情况。
但是有烽烟并不一定是出现了战争,比如说西周时期的周幽王为了博美人褒姒一笑,在没有发生战争的情况下,点燃了烽火台,各方诸侯诸侯纷纷赶来救驾,来了之后周幽王和褒姒在台上哈哈大笑,面对奇耻大辱,犬戎一怒之下杀死了周幽王。
因为烽烟意味着敌人来犯早已在人们心中达成共识,所以即使是假的,各方诸侯也会默认为真。通讯只能事先代表约定俗成的东西、而不能反映事实上发生的事情。
烽火台这种通讯方式看似简单,但却是我们现在所有高级通讯的基础,夸张一点的讲,无论多么复杂的通讯,像红外遥控、wifi、3G、5G这些都可以说成是烽烟通讯的衍生品,无论现代多么复杂的通讯方式,它的原理都是基于这种烽烟通讯演化而来的,即在某一时刻不是在传递高电平,就是低电平。
只不过这些现代化通讯传输的速率极快,在一秒当中变换高低电平几千万次,甚至上亿次,它可以使我们在及短的时间内接收/传输大量的信息。如果把时间放慢、放慢再放慢,你会发现这些现代化的通讯执行的就是不停的把烽火台点燃熄灭的过程。
串口通讯
串口通讯是电子研发人员常用的一种通讯,也是最简单的一种通讯之一。这种通讯目前最常见的一种形式是:芯片与电脑之间通讯,它的传输速率极慢,通常传输速率1-10KB/S,这个速率相比于我们现在的USB传输速度相差了几千甚至上万倍,但为什么这种通讯至今还没有被淘汰呢?
老式串口接口,现在已经淘汰
要知道电子开发人员所使用的芯片不是做存储用的,它可能传输的就是温度、距离、压力这些,即使是1K/S,我们也能在1S之内接受1024个数据,对于人类而言,这个速度显然是足够快的,1024次/S的速度就把我们开的眼花缭乱了,面对如此‘多’的数据,你会自顾不暇,所以这种低端芯片与电脑通讯往往采用串口通讯。
接下来说一下串口到底是如何在芯片和电脑之间传输的。
串口通讯本来及其简单的一种通讯,可是现在与之有关的教科书里官腔太多,而且还掺杂着很多专业术语,比如各种寄存器、锁存器这些,除此之外还讲述了串口的很多情况,同步或者异步都有,很多情况是用不到的,学生们往往是怀着期望的心去学习,但是最终却失望而归,只要有一个寄存器的原理不懂,就会影响到你学习的心情。
串口接线
很多人虽然会使用串口通讯了,但是具体是怎么发出去的,可能知道的人就不多了,反正是配置好寄存器就可以使用串口通讯了,这种学习方法是最快的,但是对这个串口的基本工作原理理解的还是不到位。
接下来我们来更深一步的去了解串口,在了解串口之前我们首先要直到串口发送的是什么?
串口其实发送的是高低电平,比如我们把要发送信息的高低电平发送给电脑,它就直到我们发送的信息,并且显示出来、那么问题又来了,电脑是如何直到这些高低电平代表的什么呢?
这些呀,早就有人想过了,就像我们之前讲过的烽烟通讯,烽烟代表敌人来犯。这个串口传输的高低电平也早就我们聪明的人类定义好了,不过这次不是中国人了,而是美国人定义的,然后全世界都这么使用了。
ASCII码
ASCII表如下图所示,每一个图形都对应的8位的二进制,比如A对应的是0100 0001,如果我们要给电脑发送A的话,是不是发送0100 0001对应的高低电平就可以了(1对应高电平)?
当然不是了,因为要成功的发送数据,在它发送数据之前,首先要给电脑发送一个开始信号,不然电脑接收就乱了,就像我们去取快递,都是在收到短信之后再过去,不然去了可能快递还没有到呢。
串口发送数据也一样,首先要发送一个开始的信号,这个信号也叫做起始位。在串口不工作的时候默认的都是高电平,如果要给电脑开始的信号,只需要给一个低电平,电脑就会被唤醒接收我们发送的串口数据,然后我们再逐次发送ASCII数据,是一个一个的发送,而不是同一时刻一起发送。串口嘛,就跟串羊肉串一样,都是一个个的往竹签上串。
这也是串口的优势,发送只需要一根线,如果是并口的话,发送8位数据,就得需要8根线,就物理接线而言,显然串口更有优势。
在8位数据发送完成之后,最后还需要发送一位停止位,即最后一位把电平拉高,告诉电脑发送结束,让电脑准备下一次接收。这东西和我们取快递一样,拿完贵重快递,不能直接走吧,最后还需要签字不是。
所以要发送A的话,需要发送:
10100 00010
1(停止位) 0100 0001(中间8个为字符A) 0(起始位)
无论是串口发送还是取快递都是人类想出来的流程,所以存在共性。
波特率
还有最后一个问题没有解决,那就是这每一位的发送间隔是多少呢?
我们还拿烽烟通讯为例,站岗小兵也不是时时刻刻在盯着烽火台,可能是一小时看一次,然后他也许会做一些娱乐项目。
现在,我们发送串口数据也一样,我们要提前约定好,多长时间发送一次,然后电脑上也要按照这个时间去接收,不然肯定会接收到错误的数据。
我们约定的这个时间就是电子专业中常说的波特率,它所指的是在一秒之内发送了多少位数据。
就拿最常用的波特率9600来说,它所代表的是在1秒之内传输9600位数据(0或1)。
知道波特率之后,我们也就知道了传输一位所需要的时间,即1/9600=104us。
104us对我们来说可能会很短暂,对芯片来却是极其漫长的时间。
这时候还是会有人担心,万一接收的时序对不上怎么办。
这个不用担心,因为芯片接收时也不是104us接收一次,它的接收精度是这个时间的16倍,即以6.5us的最小步长开始计数,它会在你每一位(104us)的中间时刻接收数据,这样误差就会变的很小。
模拟串口吧
所以,串口通讯不需要配置寄存器,直接用单片机的I/O口输出高低电平也可以实现,因为它和你在单片机上配置寄存器是一样的,如果最开始你是使用的寄存器来学习串口,可能是只会串口的收发,而不直到串口的最基本发送原理。
如果你有兴趣的话,直接在单片机上用I/O模拟串口发送试一试,虽然最终我们都会使用配置寄存器的方式发送串口数据,但这样做你会对串口发送有一个新的认识。
Final
- 上述所讲的串口通讯是最为常用的一种情况,即只有一个起始伟和停止位、无奇偶校验位、波特率为9600。
其它的情况不太常用,暂时就不做阐述。
然后再对上述情况做一个小总结:
发送的数据共10位。
第一位是起始位:把电平拉低。
第二位~第九位:数据位,由所传输的字符决定。在这10位当中,也就这8位是有意义的,因为起始位和停止位不代表任何东西,我们可以说串口传输的效率为80%。
第十位是停止位:把电平拉高。
为了检测大家有没有学会,给你们准备了一个小测试。
猜猜上图这10位代表哪个字符呢?(参考上面的ASCII码表)。