串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
- 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层规定我们用中文还是用英文来交流。
电平标准
根据通讯使用的电平标准不同,串口通信可分为TTL标准及RS-232标准,见如下表格:
通讯标准 | 电平标准(发送端) |
5V TTL | 逻辑1::2.4V ~ 5V —— 逻辑0: 0 ~ 0.5V |
RS-232 | 逻辑1::-15V ~ -3V —— 逻辑0: +3V ~ +15V |
我们常见的电子电路中常使用TTL的电平标准,如我们的计算机内部识别的就是TTL电平,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0,所以说计算机CPU也只能识别二进制的0和1;但TTL电平有个缺点就是它不适合远距离传输,所以为了增加串口通讯的远距离传输及抗干扰能力,我们通常会使用RS-232电平,RS-232电平使用-15V表示逻辑1,+15V表示逻辑0。
RS-232信号线
因为控制器一般使用TTL电平标准,所以在传输过程中就需要用到MAX3232芯片或者CH340芯片对TTL及RS-232电平的信号进行相互转换;可以这样理解,假设有两台计算机需要进行串口通信,在发送端,计算机内部的TTL电平需经过电平转换芯片(MAX3232或CH340)将其转换为RS-232电平后再进行传输,到了另一台计算机,则需要电平转换芯片(MAX3232或CH340)将接收到的RS-232电平转换为TTL电平,这样计算机CPU才能识别到。
RS-485电平
RS485标准是为了弥补RS232通信距离短、速率低等缺点而产生的而产生的,该接口标准只规定了电气特性,并没有规定接插件,传输电缆和 应用层通信协议。
RS485标准与RS232不一样,数据信号采用差分传输方式。
通常情况下,发送发送器A、B之间的征地安排在+2+6V,是一个逻辑状态,负电平在-2-6V,是另一个逻辑状态。另外有一个信号地C,在RS485器件中,一般还有一个“使能”控制信号,“使能”信号用于控制“发送发送器”与传输线的切断和连接,当使能端起作用时,发送发送器处于高阻状态,称作“第三态”,它是有别于逻辑“1”和“0”的第三种状态。
对于接收发送器,也作出 与发送发送器相对的规定,收、发端通过平衡双绞线,将A-A与B-B对应相连,当在接收端A-B之间有大于+200mV的电平时,输出正逻辑电平,小鱼-200mV时,输出负逻辑电平,在接收发送器的接收平衡线上,电平范围通常在200mV至6V之间
协议层
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通讯的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。
通俗理解就是,你通过一根信号线不断的给我发送高低电平,我这边需要确定哪些是我要的数据;首先你得给我的起始信号吧,告诉我你接下来要准备发送数据了,数据发送完了,检验一下发送得对不对,检验OK了,给个停止信号,告诉我你已经发送完毕了,那么这就是咱们双方约定好的协议了……
数据信号传输中的几个概念:
具体可查看《STM32F4xx中文参考手册》第22章通用同步异步收发器(USART)
1. 波特率
USART的全称是通(U)用同步(S)异(A)步收®发(T)器,每个字母都有它对应的含义;不过本次学习的是串口异步通讯,因为同步通讯是需要时钟信号来进行同步的,但我使用的串口线没有时钟信号;因此两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。常见的波特率为4800、9600、115200等。
2. 通讯的起始和停止信号
串口通讯的一个数据包从起始信号开始,直到停止信号结束,数据包的起始信号有一个逻辑0的数据位表示,而数据包的停止位可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。
3. 有效数据
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度通常是8位。
4. 数据校验
在有效数据之后,有一个可选的数据校验位;由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程中加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)。
奇校验 | 要求有效数据和校验位中"1"的个数为奇数 ,比如一个8位长的有效数据为:01101001,此时总共有4个"1",为达到奇校验效果,校验位为"1" ,最后传输的数据是将8位的有效数据加上1位的校验位总共9位 |
偶校验 | 偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数 |
0校验 | 不管有效数据中的内容是什么,校验位总为“0” |
1校验 | 校验位总为“1” |
无校验 | 在无校验的情况下,数据包中不含校验位 |