串口通讯

串口通信

1. 通讯基础

1.1 并行通信与串行通信

按数据传送的方式,通讯可分为串行通讯并行通讯

  • 串行是按位传输,一次传输一位。

  • 并行一般是多位同时传输。比如8位16位32位等。

image-20250413105514049

并行通讯 串行通讯
通讯距离
抗干扰能力
传输速率
成本

1.2 全双工、半双工及单工通信

image-20250413122316404

单工通信:数据只能沿一个方向传输

半双工通信:数据可以沿两个方向传输,但需要分时进行

全双工通信:数据可以同时进行双向传输

1.3 同步通信与异步通信

  • 同步

    有时钟,发送和接收双方按照预定的时钟节拍进行数据的发送和接收,双方的操作严格同步。

    image-20250413150805489

  • 异步

    无时钟,双方不需要严格的时钟同步,每个数据块之间通过特定的起始位和停止位进行分隔,接收方可以

    独立地识别每个数据块。

    image-20250413150822967

1.4 通信速率

通信速率是指在通信系统中单位时间内传输的信息量,是评估通信系统性能的重要指标之一。

  1. 比特率(Bit rate):

    • 定义:比特率是指在通信线路(或系统)中单位时间(每秒)内传输的信息量,即每秒能传输的二进制位数。它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为比特/秒(bit/s或bps)。

    • 含义:比特率越高,表示单位时间内传送的数据量越大,信息传输的速率越快。它经常被用作连接速度、传输速度、信息传输速率和数字带宽容量的同义词。

  2. 波特率(Baud rate):

    • 定义:在电子通信领域,波特率表示每秒传送的码元的个数,即单位时间内载波调制状态变化的次数。它用单位时间内载波调制状态改变次数来表示,其单位为波特(Baud)。

    • 含义:波特率描述的是单位时间内调制信号的能力,它决定了在给定时间内可以通过通信通道发送多少个离散的信号单元(码元)。在数字通信中,码元是表示数字信息的最小单位。

比特率 = 波特率 * log2 M ,M表示每个码元承载的信息量

二进制系统中,波特率数值上等于比特率

2. 串口通信

2.1 串口介绍

串口,也称为串行接口或串行通信接口(通常指COM接口),是一种采用串行通信方式的扩展接口。它实现了数据一位一位地顺序传送,具有通信线路简单、成本低但传送速度慢的特点。只要一对传输线,串口就可以实现双向通信。

串口通信的接口类型包括TTL、CMOS、RS-232和RS-485等,它们分别代表了不同的电平标准。

  • TTL电平
    • 逻辑1:5V,逻辑0:0V
  • CMOS电平
    • 逻辑1:供电电压的最大值,逻辑0:0V
  • RS-232电平
    • 逻辑1:-3V~-15V,逻辑0:+3~+15V
  • RS-485电平
    • 采用差分信号,逻辑1:两线间的电压差为+(0.26)V,逻辑0:两线间的电压差为-(0.26)V

image-20250413151541083

image-20250413151634068

2.2 串口通讯协议

image-20250413152201503

  • 波特率

    • 波特率(Baudrate),它表示每秒钟传输了多少个码元。在二进制的世界码元和位是等价的。用每秒传输的比特数表示波特率。

    • STM32提供了串口异步通讯,异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。常见的波特率为 4800、9600、115200等。

  • 空闲位

    • 串口协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据。
  • 通讯的起始位

    • 起始位为低电平时,告诉接收方数据传输即将开始,准备接收。在通信开始时,发送端首先会发送一个起始位,它是一个逻辑0(低电平)的信号,表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。用于同步发送和接收设备之间的时钟。接收端在检测到起始位后,会开始准备接收后续的数据位。
  • 通讯的停止位

    • 停止位是一个逻辑高电平(1),用于指示数据传输的结束。当停止位出现时,接收端知道数据传输已经完成,并且可以开始处理接收到的数据。停止位位于数据位和校验位之后,它的作用是确保接收端有足够的时间来识别数据帧的结束,并为下一个数据帧的到来做好准备。

    • 停止信号可由 0.5、1、1.5 或 2个逻辑1的数据位表示,只要双方约定一致即可。

  • 有效数据位

    • 在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为 5、6、7 或8位长。构成一个字符(一般都是8位)。先发送最低位,最后发送最高位,数据位紧随起始位之后,包含了要传输的实际信息。使用低电平表示‘0’高电平表示‘1’完成数据位的传输。
  • 校验位

    • 校验位用于验证数据的完整性,以确保传输过程中没有出现错误。常见的校验位选项有None(无校验位)、Odd(奇校验位)和Even(偶校验位)。在发送数据时,校验位会根据数据位中1的个数进行计算,并加入到数据中一起传输。接收端则会根据校验位的值进行校验,以判断数据是否存在错误。
    • 数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。串口校验分几种方式:
    • 无校验(no parity)。
    • 奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。
    • 偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。

3. USART外设

STM32提供了USART(Universal Synchronous Asynchronous Receiver and Transmitter)通用同步异步收发器。是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。

UART相比USART去掉了同步通讯功能。

image-20250413165522388

image-20250413170536191

3.1 功能引脚说明

  • TX:发送数据输出引脚。
  • RX:接收数据输入引脚。
  • SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
  • nRTS:请求以发送(Request To Send),n 表示低电平有效。如果使能RTS流控制,当 USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
  • nCTS:清除以发送(Clear To Send),n 表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
  • SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

USART支持硬件流控制,通过特定的信号线(如RTS/CTS)实现数据的可靠传输。当接收

端没有准备好接收数据时,可以通过RTS信号通知发送端暂停发送;当接收端准备好接收数据时,再通

过CTS信号通知发送端恢复发送。

3.2 波特率的产生

发送器和接收器的波特率是一致的,都是通过设置BRR寄存器来得到。

image-20250413165902870

这里的fck是给外设的时钟(usart1在APB2上一般是72MHz,usart2,3,4,5在APB1上一般为36MHz)。

image-20250413170130183

CPU时钟越低,对于特定的波特率,准确度就越低。可实现的波特率上限可以用这些数据来确定。
只有USART1是用PCLK2时钟(最大72 MHz)。其他USART是用PCLK1时钟(最大36 MHz)。

假设我们需要的波特率是115200,则对应的分频值应该是:39.0625,把这个值写入到BRR寄存器中。39.0625的小数部分:0.0625 * 16 = 1, 整数部分是:39(0x27)。

image-20250413170409992

所以写入到BRR寄存器的值是:0x0271。