前言
最近在做一个通过ESP8266和STM32通讯从而实现远程控制,中间需要用到串口来发送报文,通过报文来实现两者之间的通讯。
今天刚好趁着这个机会来给大家讲解一下串行通讯,希望能给大家以后的学习提供一些思路。
串行通讯介绍
串口通信线最少需要2根(GND和信号线),可以实现单工通信,也可以使用3根通信线(Tx、Rx、GND)来实现全双工。
通过串口不管发数字、文本还是命令,都要先对发送内容进行编码,编码成二进制再进行逐个位的发送。我们使用串口发送的一般都是字符,都是ASCII码编码后的字符,所以一般设置数据位都是8,方便刚好一帧发送1个字符。
那么现在我们就知道了,如果我们想要串口进行通讯,我们首先需要将我们想要发送的信息转换成为ASCII码,再通过串口线将信息以二进制的形式发送出去。
UART作为异步串口通信协议的一种,工作原理是将传输数据的每一个字符一位一位地传输,也就是我们上面说的ASCII码编码。其中每一位(bit)的意义如下:
起始位: 先发出一个逻辑“0”的信号,表示传输字符开始。
数据位: 紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。
奇偶校验位: 数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以次来校验数据传送的正确性。
停止位: 它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
空闲位: 处于逻辑“1”状态,表示当前线路上没有数据传输。
其中数据位通常采用ASCII码。从最低位开始传送,靠时钟定位。
串行数据传输的基本模式
二进制脉冲用于串行数据传输中的数据传输。二进制数字一由五伏或高逻辑表示。相反,二进制零表示为逻辑低电平或零伏。为了实现串行通信,需要源和目标。他们也被称为发送者和接收者。可以采用各种类型的串行通信,并指定为单工、半双工和全双工。
-
Simplex 方法 现单向数据传输。在此方案中,在任何给定时间只有源或目标处于活动状态。如果源正在发送数据,接收方别无选择,只能接受传输。广播电视或无线电信号时使用单工模式。
-
半双工模式 允许源和目标都处于活动状态,但不能同时处于活动状态。传输一次只发生在一个方向。使用互联网时可以看到一个恰当的例子。当您从计算机发出网页请求时,服务器会处理该请求。然后,当将信息返回到您的计算机(现在是接收方)时,它就成为发送方。
-
全双工模式 是世界上使用最广泛的串行通信形式。源和目标都处于活动状态,可以同时发送和接收数据。您的智能手机是全双工模式实际应用的典型示例。
讨论串行通信时的另一个考虑因素是两台主机的协议和字节顺序。字节顺序是指使用特定的内存地址来存储数据的方法。这是将数据存储在特定内存地址的方式。关于数据对齐字节序有两种分类。
UART串口通信的工作原理
(1)发送数据过程
空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。
(2)数据接收过程:
空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。
串行通讯和并行通讯
在常见的通讯中有两种基本的数据传输形式,分别是并行和串行通信。串行通信是逐位进行数据传输。它基本上使用两根电线,一根用于发送器,另一根用于接收器。
串行通信: 计算机与I/O设备之间,同一时刻,只能传输一个bit位的信号。传输数据按顺序依次一bit位接一bit位进行传输,通常数据在一根数据线或一对差分线上传输。
比如,当传输1字节信息时,并行通讯有8根信号线实现同时传输,假如耗时为1T,而串行是在一根信号线上,把数据排成一行、一位一位传输,需要传8次,因此耗时为8T。
并行通信: 计算机与I/O设备之间,通过多条传输线,可以同时传输多个bit位的信号。
并行通讯的效率高,但是成本高、对信号线路要求高,一般应用于快速设备之间近距离传输,譬如CPU 与存储设备、存储器与存储器、主机与打印机等都采用并行通讯。
串行通讯效率较低,但是对信号线路要求低,抗干扰能力强,同时成本也相对较低,一般用于计算机与计算机、计算机与外设之间远距离通讯。
单片机中的串口通讯
大家需要注意这里的串口通讯和我们上面谈到的串行通讯不是一个东西,串口通讯是串行通讯中的一种,在单片机调试中非常常见,也是学习单片机必须进行学习的知识,这里我们以单片机中常用的RS-232串口来进行讲解。
在上面的通讯方式中,两个通讯设备之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。
我们知道常见的电子电路中常使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。
因为控制器一般使用TTL电平标准,所以常常会使用CH340芯片对TTL及RS-232电平的信号进行互相转换。
STM32中的串口通讯
STM32芯片具有多个UART外设用于串口通讯,它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。
USART在STM32应用最多莫过于"打印"程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息"打印"在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。
STM32的USART输出的是TTL电平信号,若需要RS-232标准的信号可使用MAX3232芯片进行转换。
STM32的USART功能框图包含了USART最核心内容,掌握了功能框图,对USART就有一个整体的把握,在编程时就思路就非常清晰。
关于具体串口在STM32中怎么使用这里就不进行讲解了,想要学习的话可以去看一下野火的视频,里面讲的挺详细的。
分析串口通讯波形
在分析波形之前我们先来看一些基础概念,这样有利于我们对波形的分析:
起始位: 先发出一个逻辑”0”的信号,表示传输数据的开始。
校验位: 数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输“A”(01000001)为例。 (字符‘A’的二进制是 0100 0001)此位还可以去除,即不需要奇偶校验位。
- 当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。
- 当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。
停止位: 它是一帧数据的结束标志。可以是1bit、1.5bit、2bit的空闲电平。
空闲位: 没有数据传输时线路上的电平状态,为逻辑1。
传输方向: 即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。
uart数据传输格式:刚开始传输一个起始位——传输数据位——校验位(可不需要此位)——停止位。这样一帧的数据就传输完了。接下来接着像这样一直传送。
波形1
用串口工具发送0XD6,即二级制 1101 0110 ,在示波器上如此显示。
串口设置:波特率9600,停止位1位,无奇偶校验位。
波形如图所示:
由示波器可以看出,最左边一个低电平表示0,起始位;然后依次是0110 1011,正好和发送的数据最高位和最低位反过来,至于为什么会反过来我们上面也介绍过了,相比大家也能够理解。
波形2
用串口发送0x75,就是二进制 0111 0101,如下图所示。
串口设置:波特率9600,停止位1位,无奇偶校验位。
同理,最左侧的为起始位,低电平0, 然后LSB传输。 1010 1110依次传输到示波器。
波形3
用串口发送0x75,就是二进制 0111 0101,
串口设置:波特率9600,停止位1位,奇校验。
奇校验就是要保证这一帧里的所有BIT 有1的数为奇数,0x75已经有5个1了,所以奇偶校验位为0即可。
如果为偶校验,那么最后一位应该是高电平1,就会有6个1,以此保证所有的1的数量为偶数。
波形4
连发发送两个16进制数据0x75(0111 0101) 0x6B (0110 1011)
串口设置:波特率9600,停止位1位,无奇偶校验位。
结语
当然串行通讯不仅这一种,还是很多其他的例如I2C、SPI、CAN等,大家可以多了解一下,每个通讯方法都有着自己的通讯协议,我们如果想要使用的话需要根据自己实际需求,选择合适的通讯方式。