目录

一、通信的本质

二、信息表示

2.1 0/1信号表示

2.1.1 电平信号

2.1.2 差分信号

2.2 信号解析

2.2.1 同步通信

 2.2.2 异步通信

2.2.3 小结

2.3 通信协议

2.3.1 传输方向

2.3.2 常见通信协议

三、缓存方式


一、通信的本质

通信通信,说白的就是信息互通。人跟人间的信息互通、机器跟机器间的信息互通、机器根人之间信息互通。

而想要做到互通,主要有两个问题需要解决,“信息如何表示”和“信息该如何传输”两个核心问题。

我们知道信息交互中,最原始,朴素的表示是0和1.其中,信息传输主要指01串在介质上传输的过程,这个过程具体上跟诸如无线电、光纤和电缆如何操作实现有关,本文主要讨论的是“信息该如何表示”这一问题。

那么:

  • 在电子世界中如何表示0和1
  • 信息的发送方和接收方如何解析
  • 如何用0和1的组合表示我们所要传达的信息

就是值得讨论的问题了

二、信息表示

2.1 0/1信号表示

首先,在电子世界中0和1的表示,目前大致有两种方式

  • 电平信号
  • 差分信号

2.1.1 电平信号

电平信号,简单来说就是根据一根线上的不同的电压区间划分成高电平和低电平(如:大于3.3V为高电平,低1.5V为低电平等),通过人为定义高低电平为0或1来传输信息。

而又因为几乎不可能做到不同设备间电压完全一致,所以为了保证收发双方电压的一致性,电平信号传输通常要加一根GND线作共地作用。

2.1.2 差分信号

差分信号这哥们可以说是电平信号的弟弟,前人发现,在长距离传输信息时,传输线会变成不可忽略的等效电阻,从而造成明显的压差,致使信息丢失、失真等现象。而且电平信号只有一根数据线,容易受到电磁干扰等等。

因为以上的原因,差分信号线就粉墨登场。

 既然你一根信号线容易受到电磁干扰,长距离传输有明显的压差,那么我用两根信号线表示,根据两根信号线同一时刻的压差区间定义0和1不就可以增强抗干扰性和增长了传输距离嘛。这就是差分信号的思想。

但差分信号也不是没有缺点的。

它的问题在于线材的花销是电平信号的两倍,当我们同时传输N路信号时,电平信号只要N+1根线(N根信号线,1根共地线),而差分需要2N根线。所以电平信号和差分信号本身并无优劣之分,主要看使用场景进行选择

2.2 信号解析

信号解析的操作过程而言,其实就是信号解码的过程,发送方通过对01串进行编码发送给接收方,而接收方通过之前的约定的编码规则逆向解析。

这个发送和接收过程中会产生两个问题:

  • 接收方怎么知道发送方什么时候发送了信息?
  • 如果发送了信息,又发送了多少信息?

由以上的问题可以引申出两种不同的通信方式:

  • 同步通信
  • 异步通信

2.2.1 同步通信

同步通信,在表现形式上就是在收发双方之间加了一条时钟线。通过结合时钟线SCL的电平状态和信号线SDA的电平状态组合出诸如:起始信号、终止信号、实际想要发送的0/1信号等。

如单片机中最常用的I2C协议,它的起始和终止信号就是通过判断时钟线SCL在高电平时,信号线SDA的边沿跳变情况决定的。(关于I2C的具体内容,不了解的可以自行搜索学习)下图为同步通信示例,I2C协议的拓扑连接图 。

 2.2.2 异步通信

异步通信跟同步通信的最大区别在于——异步通信没有时钟线,只有信号线和地线。

既然没有时钟线作为辅助,那么信号线SDA就需要传输包含更多的信息,以替代时钟线的作用,诸如:

  • 我们接收方需要知道收到怎样的信号时表示一个数据的开始
  • 怎样的信号表示一个信号的结束
  • 怎样的信号表示是需要传递的数据本身

因此,异步通信传输的01串里面,必然包含起始位,停止位,以及真正需要传输的数据的数据长度。

不仅如此,我们还需要统一一下收发双方的传输速率,以便接收方能及时且准确的处理发送方发来的数据。

这个传输率,我们一般称之为波特率。波特率指的是每秒钟传送的码元个数。至于码元是啥。这里可以自行搜索学习。所以在通信过程中,波特率在大多数情况下,可以理解为比特率。即每秒钟传送的比特个数。

2.2.3 小结

同步通信

优点:

  1. 可以根据不同时钟线边沿的不同,判断信息的采集与否。
  2. 不用添加额外的状态位,增加了信息传输密度。

缺点:

  1. 需要时钟线协调
  2. 占用发送端和接收端双方的资源( 收发双方都需要,时刻关注时钟线)

异步通信

优点:

  1. 不需要额外的信号线,所占用线较少
  2. 只占用接收端的资源(需要时刻关注数据线的电平变化情况,但发送方不用)

缺点:

  1. 需要状态位表示收发状态
  2. 需要协定信息传输速率协同双方的信息处理

比较结论:

  • 同步通信比异步通信的传输效率高,适合信息交互频繁的场合
  • 异步通信,相对整体占用资源较少,适用信息交互相对较少的场合

2.3 通信协议

知道了0/1如何表示,也知道了收发双方对信号解析应该注意的事项。那么就还剩最后一个重要的问题,即:如何用0和1的组合表示我们所要传达的信息?

换句话说,对于一大串0和1序列应该如何解读?

这个问题就属于编码的范畴了,如何编码是通信协议所规定的。不同的协议有不同的编码方式,这个在学习具体通信协议时就会感受到。但它们无外乎遵从以下几点:

  • 0/1表示
  • 信号解析
  • 编码方式
  • 传输方向

传输方向前面没有提到,这里简单的介绍下:

2.3.1 传输方向

通信的传输方向可以分为以下三种:

  • 单工通信:任何时刻都只能单向传输信息
  • 半双工通信:同一时刻只能单向传输信息,即在通信过程中可以改变传输方向
  • 全双工通信:任何时刻都可以双向传输信息

由以上的定义可以看出,一般单工和半双工都是通过一根信号线实现的,而想要实现全双工,则需要两根信号线用两个端口接收

2.3.2 常见通信协议

有关通信协议的主要问题,个人觉得由有上面的理解差不多就够了。下面是简单介绍下单片机中常用的通信协议:

  • 串口协议:皆为异步全双工协议
    • RS-232:电平信号
    • RS-485:差分信号
  • I2C总线协议:同步半双工协议(电平信号)
  • SPI总线协议:同步全双工协议(电平信号)
  • 。。。。。

三、缓存方式

在通信过程中,缓存机制是很有必要的,至于为什么,请看下图:

接收端其实也是同样的道理,由此看来缓存机制的必要性。

而常见的缓存机制有两种:

  • FIFO
  • DMA

学过数据结构的对FIFO应该都不陌生,first in first out,先进先出的队列结构

还是以发送端为例,应用到上述过程的话,就是CPU把要传输的数据先丢给寄存器,由该寄存器一个bit一个bit的丢给发送端口,CPU就去干其他的活了。

但寄存器的存储空间有限,很多时候还是要把需要发送的数据拆分成多个段落分次传输,所以引申了一个原理类似,但比寄存器存储空间要大的缓存机制——DMA。

关于DMA的讨论,后续再聊。