我们通常所说的串口,一般指的是UART,即Universal Asynchronous Receiver/Transmitter,而USART则为Universal Synchronous/Asynchronous Receiver/Transmitter,区别在于USART支持同步,而UART为异步通信,事实上常用的一般都是UART。

        接下来说说串行通信,我们都知道数字信号是通过高低电平来传递0/1信息的,所以在一条通信线上,每次只能检测到一种电平,也即只能传递1位信息,即0或者1。如果我们只用这一根线去传递数据,那么所有的数据必须按位逐个通过这根线,这样的传输方式就叫做串行通信。与之相对的,同时用多根线去传递数据的,就叫做并行通信。

        我们的串口就是属于串行通信,那么它们是如何实现数据通信的呢。

        我们想一下最基本的数据传输必须具备的东西是什么,现在我们只知道线路电平代表0/1,但是不管有没有数据通信,线路电平总是存在的,那么我们怎么知道什么时候有数据呢?由此可知,要想进行通信,我们必须得知道什么时候数据通信开始,什么时候通信结束。

        我们可以用低电平来表示数据传输开始,高电平表示传输停止。由于无数据传输时一直是高电平,所以当电平从持续的高电平变成了低电平,就表示传输开始了。但是这个持续的高电平到底得持续多久才能算是停止状态呢,这个时间该如何度量呢?这就引进另一个重要参数通信速率,有了通信速率我们就知道应该以什么样的频率去读取电平,知道每一个有效位要持续多久了。

        我们规定一般是至少两个有效位的持续高电平表示传输停止,而从停止状态的高电平变成低电平后,表示数据传输开始。接下来的每一位都是数据内容了,那么到底取多少位的数据呢,一般是8位,刚好一个字节。当然也可以是其它长度,比如5位,在取完5位的数据后,应该就到了停止位(事实上停止位后还有总线自动上拉的空闲位),也就是该持续两个位以上的高电平了。

        好了,现在已经得到几个重要参数了,起始位,停止位,通信速率,数据长度,有了这些就已经能够实现串口通信了。但事实上串口通信除了以上参数外,还有些其他的,完整的标准参数名称如下:

  1. 波特率:确定通信速度,获知位(bit)持续时间
  2. 起始位:确定通信开始
  3. 数据位:确定数据长度
  4. 停止位:确定通信结束
  5. 校验位:数据校验,防干扰出错
  6. 空闲位:停止位后,总线自动保持的高电平位

        以上这些就是串口通信协议,有了这个,一根线就可以传输数据了,前提还得收发双方参数设置一样,否则就会乱码。

        比如我们设定起始位1位,停止位1位,数据位8位(刚好传递一个字节,所以最常用),9600波特率,无校验位,根据9600波特率可以知道每个位的持续时间约104us。

        假设发送“123”,那么会依次发‘1’,‘2’,‘3’。ASCII码的‘1’,‘2’,‘3’换算成16进制字节数分别为0x31,0x32,0x33。那么发送端会操作电平0(起始)-00110001-1(停止),0(起始)-00110010-1(停止),0(起始)-00110011-1(停止),接收端只要按顺序依次解析就可以还原出数据来。

        在这里顺便提一下,数据是按位传输的,所以从高到低的发和从低到高的发是不一样的,所以串口也规定了发送时先从低位发的,如0x31实际传输顺序为0(起始)-10001100-1(停止)。