注明:本文仅代表我个人观点和理解,欢迎讨论!
前言:鄙人只是个普通1.5本院校的嵌入式小菜鸟,本文详细记录了鄙人的学习过程,并总结了一些其他基本知识帮助我理解,故余虽愚,卒获有所闻。我认为学习是要输入和输出共同存在的。如何理解?就是我向内输入知识的时候,我理解了,我看懂了听懂了,但是你未必能内化成自己的东西向外输出。就像你学生时期上课看懂了几个新概念学了几个新公式,你就觉得你理解了你行了,然后一做题发现还是有点困难,就证明还是没有完全掌握,于是就有“刷题”。所以要掌握一个知识必须重复输出多次,中学时的那句名言“教学相长也”同样应证了这个道理。本文就以学习江科大stm32的教程为例,从输入到输出彻底理解串口通信协议。某些概念我尝试用比较通俗的语言来另作解释帮助理解,可能有些比喻不太恰当,但也仅代表我个人理解,望大家多多包涵哈。
一、串行通信的基本知识
学习通信协议前,我们需要先一起来了解一下基本知识!
那我们为什么要学通信啊,有什么用???直接讲设备之间的通信可能比较抽象,我们可以把设备当作人,把设备之间的通信当作人之间的交流,一个人的能力再强大,如果没有和其他人交流的能力,那他能发挥的作用也终究存在上限。设备也一样,设备之间如果能进行通信,就能充分发挥他们的功能!而人之间的交流在某些情况下需要有些约定俗成,设备之间也就有了通信协议。
所以,我们就能理解:
通信的目的是设备之间互相接收和发送数据,拓展硬件系统。
通信协议是通信双方按照约定协议收发数据。
1.基本通信方式及特点
数据通信的两种基本方式:并行通信和串行通信。
并行通信
各个数据位同时进行传送,每个数据位单独使用一根数据线,多位数据同时传输。传输速度快,效率高,但是在长距离传输时硬件成本较高,一般只适用于短距离(小于30米)的数据通信。计算机内部的数据传送一般采用并行。
串行通信
各个数据位逐位传输,只使用一条数据线,每一位数据占据一个固定的时间长度。传输速度慢,数据的传输控制较复杂,但成本低,非常适用于远距离传输。
2.串行通信的数据传送方式
串行通信的数据传送方式有单工、半双工、全双工等方式。
单工
数据仅能按一个固定方向传送,通信双方其中一方固定为发送方,另一方固定为接收方。(是不是很像一个舔狗只能单方面地对对方付出,但是对方没有任何回馈?)
半双工
数据可以双向传送,但发送和接收不能同时进行,即任意时刻只能由其中一方发送数据,另一方接收数据,因此半双工也可以只使用一条数据线。(是不是很像两个海王的互相拉扯?你进我退,我退你进,就是玩儿!)
全双工
数据也是可以双向传送的,而且两设备可以同时进行发送和接收数据,所以需要两条数据线。(这就像是两个真诚对待彼此的两个人,随时可以表达和接收爱意)
3.串行通信的分类
串行通信分为同步通信和异步通信。
同步通信
同步串行通信中,所有设备由同一个时钟源控制。同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。它们均由同步字符、数据块(若干个数据字符组成)和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。
异步通信
异步串行通信和同步串行通信最主要的区别是接收设备和发送设备不需要同一时钟源控制,双方有各自的时钟信号,这些时钟通常不同步,但是为了保证数据传送的正确性,时钟的频率要保持一致。典型的异步通信数据帧格式由起始位(低电平)、数据位、奇偶校验位、停止位(高电平)组成。异步通信中,在异步通信中有两个比较重要的指标:字符帧格式和波特率。数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
简而言之,同步通信就是双方共用同一个时钟源,异步通信就是双方有各自的时钟源。
4.串行通信的波特率
波特率:每秒传送信号的数量(码元的个数),单位为波特(B,码元/s)。常用的波特率有: 9600、 19200、 38400、 57600和115200。
比特率:每秒传送的信息量(比特数),是有效数据的传输速率,单位为bps或bit/s。
在单片机串行通信中,传送的是二进制信息,所以波特率和比特率在数值上相等。
例如,通信双方每秒传送数据的速率是100字符/秒,每个字符包含10位(1个起始位,8个数据位,1个停止位),则
波特率=比特率=100*10=1000 b/s
每一位的传送时间=1/1000=0.001s=1ms
了解了串行通信的基本知识后,下面开始是本文的重头戏!
谁懂啊家人们!你们能体会到学习过程中那种层层渐进的乐趣吗??
二、USART串口协议
串口的硬件电路
简单双向串口通信有两根通信线(发送端TX和接收端RX),TX与RX交叉连接,当只需单向的数据传输时,可以只接一根通信线。如果两个设备各自有独立供电的电源,则VCC可以不用连接。GND一定要接,因为TX和RX的高低电平都是相对于GND的。
当电平标准不一致时,需要加电平转换芯片。
串口常用的电平标准有如下三种,
TTL电平:+3.3V或+5V表示1,0V表示0
RS232电平:-3~-15V表示1,+3~+15V表示0
RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
串口时序
因为串口一般是异步通信,数据是一帧一帧传送的,每一帧由起始位(低电平)、数据位、奇偶校验位、停止位组成。收发双方必须约定一个通信速率,这个速率参数就是波特率。
起始位:标志一个数据帧的开始,固定为低电平。目的是产生下降沿打破空闲状态时的高电平,告诉对方我要开始发信息了。
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行。注意不要搞反,在时序图上最低位是在最左边!
校验位:用于数据验证,根据数据位计算得来。校验有无校验、奇校验和偶校验三种方式。
停止位:用于数据帧间隔,固定为高电平。目的是告诉对方我的信息发送完毕,并为下一次的发送做准备,进入空闲状态。
奇偶校验是检验串行通信双方传输数据是否正确的一项措施。奇校验规定8位有效数据连同1位校验位中二进制数“1”的个数为奇数;偶校验规定8位有效数据连同1位校验位中二进制数“1”的个数为偶数。所以如果是奇校验,发送方在发送数据后会补一个校验位使“1”的个数为奇数;接收方接收到数据后会验证“1”的个数是否为奇数,如果确实是奇数,则认为传输中没有出错,如果不是奇数,则认为传输出错,选择丢弃或要求重传。
显然,奇偶校验的方法很粗糙,检出率低,有时候不一定能检测到传输数据是否有误。如果想要更高的检出率,可以了解CRC校验。
USART和UART的区别
USART也叫通用同步/异步串行接收/发送器。USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。和UART(通用异步收发器)一样也是一种通用串行接口。它们的主要区别如下:
1. 同步通信支持:USART支持同步通信方式,可以通过外部时钟信号进行同步传输,而UART仅支持异步通信方式。
2. 时钟信号:USART在同步模式下需要外部提供时钟信号(例如,外部时钟源或主/从模式下使用另一个USART作为主时钟源),而UART不需要外部时钟信号,仅通过波特率发生器生成时钟。
3. 通信效率:由于USART支持同步通信,可以提供更高的通信速率,适用于高速通信要求。而UART由于使用异步通信,通信速率受限于波特率发生器的设置。
4. 数据传输方式:UART使用无时钟信号的异步传输方式,适用于简单的数据传输。USART则可以使用同步传输或异步传输,支持更多的通信方式。
USART是通用的串行通信接口,可以在异步传输模式下使用,与UART具有相同的功能和使用方式。USART可以配置为UART模式的几种通信方式,包括设置波特率、数据位数、停止位数、校验位等。只需将USART配置为异步模式并设置适当的参数,即可作为UART使用。
所以使用USART具有更大的灵活性和功能。例如,USART支持同步模式通信,可以更高的通信速率。如果采用UART的简单异步通信满足需求,也可以直接将USART配置为UART模式使用。
关于串口通信就先讲这些,累了,stm32中的USART外设等有空了再详细展开。。。
部分参考资料来源:
宋跃.《单片微机原理与接口技术》.第2版——电子工业出版社
江科大stm32入门教程 [9-3] 串口发送&串口发送+接收