串口通讯的物理连接和传输协议,是学习单片机串口编程的基础。
本文参照《深入浅出玩转51单片机》和《零死角玩转STM32》书籍,对通讯以及串口一些基本概念做了详解。
1. 串口通讯的基本概念
1.1 基本方式
基本方式分并行通讯和串行通讯
1.1.1 并行通讯
并行通讯是指数据的每一位同时在多根数据线上发送或者接收。
其特点是各数据位同时传送,速度快、效率高,有多少数据位就需要多少根数据线,传送成本高。在集成电路芯片的内部、同一硬件板上各部件之间等的数据传送采用并行的方式,并行通讯传送的距离通常小于30m。
1.1.2 串行通讯
数据的每一位在同一根数据线上按照顺序逐位发生或者接收,
其特点是数据按位顺序进行,最少只需要一根传输线即可完成,成本低,速度慢。计算机与远程终端、远程终端之间数据的传输同常都是串行的。
串行通讯与并行通讯对比,串行通讯的显著特点为:传输距离较长,可以从几米到几千米,串行通讯的通讯时钟频率较容易提高,抗干扰能力强,其信号间互相干扰可以完全忽略,但是串行通讯比并行通讯慢得多。串行通讯在数据采集和控制系统中得到了广泛的应用。
1.2 工作模式
串行通讯的基础是单线传输,数据通常是在两个站点之间进行传输,按照数据流的方向分为3种传输模式:
1.2.1 单工模式(Simplex)
单工模式的数据是单向的,通讯双方一方为发送端,另一方则固定为接收端。信息只能沿一个方向传输,使用一根数据线。例如收音机,只能接收发射塔给它的数据,并不能给发射塔发数据。
1.2.2 半双工模式(Half duplex)
半双工模式是指通讯双方都具有发送器和接收器,双方既可以发射也可以接收,但是接收和发射不能同时进行。
半双工一般用数据能在两个方向传输的场合,例如对讲机。
1.2.3 全双工模式(Full duplex)
全双工数据通讯分别由两根可以在两个不同的站点同时发送和接收的传输线进行传输数据,通讯双方能在同一时刻进行发送和接收操作。
全双工模式下,每一端都有发送器和接收器,有两条传输线可以在交互式应用场合中使用,信息传输效率高,例如手机。
1.3 同步方式
根据通讯的数据同步方式,可分为同步和异步两种,根据通讯过程中是否使用到时钟信号进行区分。
在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。
在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率等,以便更好地同步。
在同步通讯中,数据信号所传输的内容绝大部分是有效数据,而异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率高,但是同步通讯双方的时钟允许误差小,稍稍时钟出错就可能导致数据错乱,异步通讯双方的时钟允许误差较大。
2. RS-232串口通讯标准和接口定义
2.1 物理层
这里讲解RS-232标准,RS-232标准主要规定了信号的用途,通讯接口以及信号的电平标准。
使用RS-232标准串口的设备间通讯结构图如下:
两个通讯设备的“DB9接口”之间用串口线建立起连接,串口线中使用RS-232标准传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以信号需要经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”电平信号。
通讯使用的电平标准详细表如下:
常见的电子电路中常用TTL的电平标准。理想状态下使用5V表示二进制逻辑1,使用0V表示二进制逻辑0。为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。
在稍旧式的计算机中一般会有RS-232标准的COM接口,也称为DB9接口。
其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。
DB9 接口中的公头及母头的各个引脚的标准信号线接法:
RS-232的每一个引脚都有它的作用,也有信号流动方向。原先的RS-232是用来连接调制解调器的(俗称“猫”)的,因此它的引脚位意义通常也和调制解调器传输相关。
从功能上来看,全部信号线分为3类:数据线(TXD、RXD)、地线(GND)和联络控制线(DSR、DTR、RI、DCD、RTS、CTS)
两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,所以两个串口设备之间必须要使用地线连接,即共地。
串口线中的联络控制线使用逻辑1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线为逻辑1时,其目的是告知远端的调制解调器本机已准备好接收数据,0表示还没准备就绪。
在目前的其它工业控制使用的串口通讯中,一般只使用RXD、TXD以及GND三条信号线,直接传输数据信号,RTS、CTS等联络控制线被裁剪掉。
2.2 协议层
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口,通讯双方的数据包格式要规约一致才能正常收发数据。串口通讯协议层中,规定了数据包的内容,它由起始位、主体数据位、校验位以及停止位组成。
如上为串口异步通讯的格式帧。
2.2.1 波特率
讲波特率之前首先了解一下通讯速率。通讯速率通常是以比特率来表示,即每秒钟传输的二进制位数,单位为比特每秒(bit/s)。容易和比特率混淆的概念是“波特率”,它表示每秒传输了多少码元。码元是通讯信号调制的概念,时间间隔相同的符号来表示一个二进制数字,这样的信号就称为码元。如常见的通讯传输中,用0V表示数字0,5V表示数字1,那么一个码元可以表示两种状态0和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;若传输中,有0V、2V、4V和6V分别表示00、01、10、11,那么每个码元可以表示四种状态,两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。因为很多常见的通讯中一个码元都是表示两种状态,人们常常直接以波特率来表示比特率,其实二者是有区别的。
异步通讯由于没有时钟信号(DB9接口中是没有信号线的),所以两个通讯设备需要规约好波特率,即每个码元的长度,以便对信号进行解码。图中一个矩形表示一个码元。常见的波特率为4800,9600,115200。
2.2.2 通讯的起始位和停止位
串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。
2.2.3 数据位
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7 或8 位长。
2.2.4 数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。
奇校验:要求有效数据和校验位中“1”的个数为奇数
偶校验:与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数
0/1校验:不管有效数据中的内容是什么,校验位总为0或者1