转载 UART、TTL、RS232等概念的区别与联系
通信里面的常见概念太多,例如UART、TTL、RS232、RS485、IIC、SPI、USB、RJ45等等,要想搞懂它们都是啥,对它们进行一个很好的分类是很重要的。在分类之前,我们需要先讲几个基本概念。
首先解释一下通信,对于有线通信来说,所谓通信就是在导线上传输电信号。有线通信主要分两种,串行和并行。常见的接口中,USB是串行,PCI是并行。它们的主要区别在于01数据是一次传一个还是一次传多个。
串行通信主要又分成两种,同步通信和异步通信。主要区别在于同步通信要利用时钟信号确定信息,而异步通信是通过约定传输速率并在将要传输的数据中增加冗余信息从而识别出信息的开始和结束位置。IIC(I²C)和SPI都属于同步通信,UART和USB属于异步通信,事实上UART就是Universal Asynchronous Receiver/Transmitter(通用异步收发传输器)的缩写。
本文主要讨论的是异步串行通信里的相关概念。在开始讨论之前,我还想说明一下,虽然通信就只是在导线上传输电信号,但它有几个关键点:
线材(是用铜还是其他金属?)及线材的组织方式(双绞线那样的还是同轴电缆那样的或者其他?)和两端接口的形状(例如同是8根线的Lightning和RJ45接口)。
一些电气特性,例如01怎么代表(用多大的电压?),怎么传输(管脚定义?是用单端信号还是差分信号?),即一些物理层面的协议。
传输的01信号是怎么代表有用的信息的,即软件层面的协议。
考虑了以上内容之后,我们就可以对标题中的概念进行解释了。
我们在讨论开发板上的串口时,常见的不外乎有UART、TTL、RS232这几个概念,其实很容易把它们说明白:
UART其实是一种软件层面的协议,定义了我们的信息要怎么组织封装成一串01序列。
TTL本身是指一种集成电路的设计工艺,而我们常说的TTL指的是TTL电路的电平标准,可以认为是一种物理层面的协议,但它只定义了表示01所使用的电压,没有定义怎么传输。通常有5V和3.3V两种。
RS232的内容多一些,物理层面的内容基本都定义了,具体可以查看wiki。RS232通常使用DE-9的D-sub接口,内部的数据通常采用UART协议。
类似地,再分析USB。USB这个概念比较庞大,不仅定义了接口形状和物理层面的协议,软件层面的协议也一并定义了。也可以说是USB把这些内容都纳入到了一个概念内。
所以,UART就是串口协议的一种,RS232是物理层的标准。所以说UART里只有01但没有电压这么一说。一般板子会把通过URAT协议组织好的01信号用TTL电平标准直接输出,这相当于一个原始的信号。之所以说它是个原始的信号是因为这里面是没有什么线材标准之说的,只定义了01相对应的电压大小,连接也是直接用导线连出来。不过,我们也可以处理一下这个信号,做成符合RS232接口标准的RS232接口进行输出。类似地,虽然UART最常用TTL和RS232,实际上还有其他很多接口仍在使用,做成这些接口也是可以的,例如传输差分信号的RS485,甚至是常用于以太网口的RJ45接口。
一个题外话,关于RS232目前常用的接口形状的名称究竟是DE-9还是DB-9的问题,wiki上有解释:
However, this naming pattern is not always followed. Because personal computers first used DB-25 connectors for their serial and parallel ports, when the PC serial port began to use 9-pin connectors, they were often labeled as DB-9 instead of DE-9 connectors, due to an ignorance of the fact that B represented a shell size. It is now common to see DE-9 connectors sold as DB-9 connectors. DB-9 nearly always refers to a 9-pin connector with an E size shell.
–https://en.wikipedia.org/wiki/D-subminiature
大意就是RS232最初用的是DB-25接口,后来PC上广泛使用9针接口来替代25针,一些人不知道DB-25中的B指的是接口外壳大小,把DB当成整体了,于是直接把25改成了9,认为它是DB-9。但实际上这个9针接口的外壳类型是E,是DE-9接口。因此现在所说的DB-9几乎指的都是DE-9。
再详细一点,举个例子,有个比较常见的说法:“这个开发板上的串口是TTL接口,我们可以用USB转TTL的转接头把它连到电脑上,比较常见的是使用PL2303芯片的转接头”。
我们来分析下这句话。“开发板上的串口是TTL接口”在本质上通常指的是开发板上引出的几个管脚,它使用TTL电压标准输出串行数据,协议通常是UART,相当于一种RAW信号。一个USB to TTL转接头的作用是把这个RAW的UART数据使用USB协议封装后传到PC上,可以理解成UART over USB。有些开发版上直接就有RS232接口,如果PC上也有RS232口,那就可以直接连接。其实如果PC有RS232的话,也可以用TTL to RS232转接头转换,常用的芯片是MAX3232。但这里面就只涉及到电压转换的问题了,没有数据的改变和封装,不像USB to TTL,还要借助USB协议。
当然,TTL输出的数据除了UART,也可以采用IIC、SPI等协议。但由于PC硬件上不自带支持,因此在PC上想使用这些协议就会比较麻烦,于是一般用的都是UART。
讲了这么多,最后还是要深入浅出一下。所以,一句话总结一下就是:不同层面的东西可以自由选取,因此可以选择采用不同的搭配方式;但有一些因为历史或者为了方便使用等等原因,形成了一些固定的搭配。只要我们理解了这一点,并对概念清晰地归类,就可以从更高的角度看待它们。