通讯就是信息的传递,传递信息的载体各式各样,有光,空气,导线,电磁场,甚至人本身也可以视作载体。
举个例子,你从深圳用手机打个电话到北京,你说的话的内容就是信息,这个信息原本是存在你的大脑里面的,然后通过空气的振动传递到话筒的喇叭上,喇叭把空气的振动转换成电信号,通过导线传输到芯片,经过调制处理,将信息加载到电磁场发射出去,然后被手机基站所检测到,又转换成电信号,然后可能会进入pstn公用电话网路,如果是长途的话,可能会把电信号转换成光信号,然后通过光缆传输,至此,信走过了一半的路程,另一半的路程和这一半是个相反的过程。
这些载体实际上就是信息传输的物理介质,是通讯的基石。
传输信息不仅仅需要载体,还需要协议才行。最简单的协议至少有两层,一层是物理层,一层是逻辑层。物理层规定了实现协议所需的物理介质,以及物理介质具体的架构形式,电气参数等。逻辑层规定了具体的通讯数据格式。
举个例子,在同一块电路板上的两个单片机进行全双工通讯。物理层的协议,至少需要两块单片机共地,另外还需要用两根导线连接单片机用于发送和接收信号,至于电气参数有可能会采用TTL逻辑电平标准。逻辑层的协议,使用公有UART协议,然后再确定波特率,数据位数,停止位数,有无校验码即可。如果用硬件来实现逻辑层的协议,就是硬件UART,否则的话就是软件UART,比如用普通IO口来模拟UART就属于软件UART。
如果是复杂一点的协议,可能就不止两层,比如说著名的OSI协议就由七层协议组成。当然OSI属于相当复杂的协议,简单一点的,比如说很多专用芯片内嵌的私有串口协议就是在上一段所说的两层公有协议的基础上再加上一层私有协议层,这样的话,单片机在与这些专用芯片进行串口通讯的时候,即使采用的是具有硬件UART的单片机,也必须另外编写软件代码来实现那个私有协议层。
不同层的协议实际上是可以互相组合的,还是拿两个单片机之间的全双工通讯来说,逻辑层采用UART协议,物理层根据不同的通讯距离可以采用不同的协议,板级通讯可以简单的用导线直接相连(这也可以算一种协议),20米左右以下的距离可以采用RS232协议,几千米以下的距离可以采用RS485协议。
在传输信息时,也经常见到各种协议交替使用的情况。还是拿还是拿两个单片机之间的全双工通讯来说,假设两个单片机距离有10米,就需在两个单片机之间加两个max232芯片,具体的协议情况如下:第一个单片机到第一个max232芯片之间逻辑层协议为UART,物理层协议为导线直接相连(单片机和max232),两个max232之间的逻辑层协议为UART,物理层协议为RS232,第二个max232芯片和第二个单片机之间的逻辑层协议为UART,物理层协议为导线直接相连(单片机和max232)。我举的这个例子,逻辑层协议都是UART,但物理层的协议有两种。还有更加复杂的情况,假设在两个单片机之间的全双工通讯路径中间加入两台电脑,然后这两台电脑通过以太网相连,如果把电脑看成一个黑盒子的话,那么电脑的作用就是进行各层协议的转换,以使信息能在网络上传输。同样的道理,两个单片机之间wifi或蓝牙传输数据也无非是协议的转换罢了。
明白了通讯的本质后,我们也可以自己设计简单的协议来进行通讯,比如用一根线在两个单片机之间单向传输简单的信息,或是在单片机IO上接一个LED来向人传递信息。 物理层的协议很简单,无需多说,逻辑层的协议也可以任意设计(如果只是传输简单的信息的话)。举个例子,你要通过一个IO口接一个LED来传递DS18b20测出的温度数据。那么我们可以这样来设计逻辑层的协议,LED亮一秒代表数据传输准备开始,接下来的8秒传输一个字节的有符号二进制数, 每秒传输1位,LED快闪代表1,慢闪代表0,传完8位后,熄灭1秒代表数据传输完毕。然后开始下一轮的传输,如此循环。这样,每10秒可以传输一次温度数据。