day9 串口通信

1串口通信

串口通信是嵌入式系统和电子设备中最常用的 异步串行通信 方式,核心是通过 TX(发送)R(接收) 两根线实现全双工数据传输。

2通信协议分类

2.1同步/异步通信

同步和异步是串行通信中两种根本不同的数据传输方式,核心区别在于 是否需要共享时钟信号来协调数据传输。

2.1.1同步通信

同步通信:带时钟同步信号 ,如IIC接口或者SPI接口都属于同步通信,要求通信双方必须使用同一个时钟,相当于发送数据的同时接收数据,同步通信属于连续串行传输数据,一次只传输一帧数据,相比于异步通信而言,传输效率更高,缺点是时钟必须一致

2.1.2异步通信

异步通信:不带时钟同步信号 ,如UART接口属于异步通信,要求通信双方具有发送端和接收端,由于不要求时钟同步,所以在通信的时候,通信双方必须提前约定好通信格式(字符格式)以及通信速率,异步通信以字符为单位进行传输,在传输一个字符的时候会添加起始位和停止位,通过起始位以及停止位来达到同步的功能。

2.1.3关键对比

|-------|-----------------|------------------|
| 对比项 | 同步通信 | 异步通信 |
| 时钟信号 | 必需(SCL、SCLK) | 无需 |
| 数据帧格式 | 无起始/停止位,连续传输 | 每帧含起始/停止位 |
| 速度 | 高(SPI可达100Mbps) | 低(通常<1Mbps) |
| 距离 | 短(通常<1m) | 长(RS485可达1200m) |
| 复杂度 | 高(需时钟同步) | 低(仅需波特率一致) |
| 典型协议 | SPI、I2C | UART、RS232、RS485 |

2.2串行/并行通信

2.2.1串行通信

传输原理:数据按位依次顺序传输,如发送字节0x41(ASCII 'A')的二进制01000001,从LSB或MSB开始逐个传输。

优点:节约引脚资源(最少一根线)、传输成本低、传输距离远

缺点:传输速度慢

应用领域:一般用于工控设备、测量设备、少部分通信设备 USB COM口

2.2.2并行通信

传输原理:多位数据同时通过多根数据线发送。例如,8位数据0x41通过8根线同时传输,每根线对应1位。

优点:传输速度快

缺点:占用引脚资源、传输成本高、传输距离近、抗干扰能力弱(串扰)

应用领域:一般大量数据传输,并且传输距离较近 如计算机总线

2.3单工/半双工/全双工通信

2.3.1单工/半双工/全双工概念对比

|-----|--------------------|-----------------|-----------------|
| 模式 | 数据传输方向 | 典型协议/硬件 | 优缺点 |
| 单工 | 单向固定(A→B) | 广播、遥控器、FM收音机 | 简单;无法反向传输 |
| 半双工 | 双向交替(A→B或B→A,不同时) | RS485、对讲机、I2C | 节省线路;需切换方向,效率较低 |
| 全双工 | 双向同时(A→B和B→A可同时进行) | UART、SPI、电话、USB | 高效;需独立通道,成本略高 |

2.3.2单工/半双工/全双工对比

|------|--------|-----------|---------------|
| 维度 | 单工 | 半双工 | 全双工 |
| 效率 | 最低 | 中等(需切换方向) | 最高(双向同时) |
| 成本 | 最低(单线) | 中等(共享线路) | 较高(独立通道) |
| 典型场景 | 广播、遥控 | 工业总线、对讲机 | 电话、USB、高速数据传输 |
| 协议举例 | FM广播 | RS485、I2C | UART、SPI、以太网 |

3通信接口

通信双方可以实现按照某一种协议进行通信的前提是:首先双方都有一个相同的通信接口。该接口还要可以按照通信协议进行数据的收发。

口协议只规定了按照怎样的顺序传输,但是数字量如何转换,

按照什么电平标准到另一个器件,这个不是协议所规定的

RS232,RS485电平是串口通信过程中的一种电平标准,不是协议

例如:

硬件设备和计算机在通信的时候,需要用到电气转换芯片(如MAX232),因为硬件平台一般采用TTL电平信号(采用正逻辑电平,+5V等价于逻辑1,0V等价于逻辑0),但是计算机采用RS232电平信号(采用负逻辑电平,-15V~-3V 表示逻辑1,+3V~+15V 表示逻辑0)。

通信时一般数据都是以二进制进行收发,那么电压信号在什么情况下为逻辑"1",在什么情况下为逻辑"0",这时就需要按照相同的电平规范来接收。

TTL电平规范

COMS

RS485电平规范

4串口通信的参数

USART或者UART都是全双工异步通信,由于不需要时钟同步,所以就必须要求通信双方要约定字符格式和通信速率。

4.1字符格式

字符格式一般都是采用字符帧的形式进行传输,字符帧由起始位、数据位、校验位、停止位组成。具体的说明可以参考STM32中文参考手册的26.3.1章节。

UART通信的数据帧格式:1位起始位('0'),5~8位数据位,1位校验位,0.5、1、1.5、2位停止位

起始位:告知接收方数据开始发送。

数据位:保存传输的数据

校验位:分为奇校验、偶校验和无校验,若选择奇校验,则数据位和校验位上1的总个数为奇数,若选择偶校验,1的个数为偶数。

**(1) 起始位:**指的是一帧数据的开始 规定为1bit的低电平

**(2) 数据位:**指的是有效的信息,可以为7bit(标准ASCII码)或者8bit(拓展ASCII码)

(3) 校验位:指的是对于数据位的简单校验,可以确保数据正常发送,也可以避免噪声的影响,校验分为奇校验、偶校验,校验位也只占1bit。一般不使用校验位。

(4) 停止位:指的是一帧数据传输完成 停止位一般选择1bit,规定为高电平

4.2通信速率

通信速率指的是单位时间内传输的有效的二进制数的个数,也被称为波特率,单位为bps。常用的波特率有9600bps 、115200bps。 可以根据实际需求进行修改。

举个例子:一般采用的波特率是9600bps,字符格式选择8bit数据位、无校验、1bit停止位,然后再加上1bit的起始位,所以一帧字符占10bit,所以单位时间可以传输960帧。

5代码配置

5.1配置步骤

stm32f4xx_tim.c函数中可以查看

===============================================================================

How to use this driver

===============================================================================

..

(#) Enable peripheral clock using the following functions
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5.

1.使能USART

(#) According to the USART mode, enable the GPIO clocks using
RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS,
or/and SCLK).

2.使能GPIO

(#) Peripheral's alternate function:
(++) Connect the pin to the desired peripherals' Alternate
Function (AF) using GPIO_PinAFConfig() function

3.使用GPIO_PinAFConfig()将引脚复用
(++) Configure the desired pin in alternate function by:

4通过以下方式将引脚配置为复用功能
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF

(++) Select the type, pull-up/pull-down and output speed via
GPIO_PuPd, GPIO_OType and GPIO_Speed members
(++) Call GPIO_Init() function

(#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware
flow control and Mode(Receiver/Transmitter) using the USART_Init()
function.

5对串口参数进行配置USART_Init()

(#) For synchronous mode, enable the clock and program the polarity,
phase and last bit using the USART_ClockInit() function.
对于同步模式,这个不用

(#) Enable theNVIC and the corresponding interrupt using the function
USART_ITConfig() if you need to use interrupt mode.

6打开串口中断,配置NVIC

(#) When using the DMA mode
(++) Configure the DMA using DMA_Init() function
(++) Active the needed channel Request using USART_DMACmd() function
DMA的,这个不用

(#) Enable the USART using the USART_Cmd() function.

7打开串口USART_Cmd()

8编写中断服务函数

(#) Enable the DMA using the DMA_Cmd() function, when using DMA mode.

-@- Refer to Multi-Processor, LIN, half-duplex, Smartcard, IrDA sub-sections
for more details

5.2代码整体

实现电脑对单片机数据发送,并显示。使用单片机USART1串口中断方式

mian.c函数

usart.c

5.3出现问题

数据接收区一直是问号

通过打开示例工程,将代码复制进去可以用,知道配置没有错,最后找到问题出在HSE时钟上,单片机实际使用时钟为8MHZ,但是stm32f4xx.h文件中是25MHZ时钟需要修改。

5.4代码解析

5.4.1结构体USART_InitTypeDef USART_InitStructure;变量配置

  1. USART_BaudRate 指的是波特率 常用9600bps 115200bps
  2. USART_WordLength 指的是数据位 常用8bit 低位先出
  1. USART_StopBits 指的是停止位 常用1bit
  1. USART_Parity 指的是校验位 常用无校验
  1. USART_Mode 指的是串口模式 常用收发模式 USART_Mode_Rx | USART_Mode_Tx
  1. USART_HardwareFlowControl 指的是硬件流控制 常用无

5.4.2指定USART中断源,收到数据就发生中断

编写中断服务函数,一般需要提前设置好串口中断的触发条件,一般触发条件都会设置为接收到数据就发生中断。

ST公司提供了一个函数可以设置串口中断源,调用USART_ITConfig()函数

一般在中断服务函数中需要检测中断是否发生(检测中断状态)以及清除中断状态即可。

5.4.3中断服务函数

发送数据

接收数据(需要在中断服务函数中调用该函数来接收数据)

读取状态

状态寄存器

USART_GetFlagStatus(USART1,USART_FLAG_TXE) ;//检测发送寄存器发完,为空

USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志