1.串口USART概述
1.1 USART就是通用同步异步收发器
-
TX:串口输出信号
-
RX:串行输入信号
-
nCTS:允许发送信号,低电平有效。例如:如果对方设备准备好接收数据了,对方设备发送低电平给nCTS,本机就可以发送数据了
-
nRTS:请求发送信号,低电平有效。例如:如果本机准备好接收数据了,就将nRTS设置为低电平,通知对方设备可以发送数据了
-
SCLK:发送器输出的时钟信号,这个时钟信号线仅用于同步模式
1.2 串口的三种工作模式:
- 普通异步通信: 使用引脚 TX 和 RX;(常用方式)
- 带硬件流控制信号的异步通信:使用引脚: TX RX nCTS nRTS
- 同步通信:TX RX SCLK
1.3 四种串口连接电路:(软件完全一致)
- 串口与串口连接电路
- 串口与RS232连接电路(电平转接芯片:SP3232)
- 串口与RS485连接电路(电平转接芯片:SP3485)
- 串口与USB连接电路(电平转接芯片:CH340或 PL2303)
1.4 常用功能函数
1.4.1 轮询模式常用功能函数
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); //发送一个缓冲区的数据,发送完成或超时后才返回,返回值为 HAL_OK
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//接收一个缓冲区的数据,接收完成或超时后才返回,返回值为 HAL_OK
案例1:发送的轮询模式
uint8_t clockStr[]="18:!45\n";
HAL_UART_Transmit(&huart2, clockStr, sizeof(clockStr), 200);
// 通过串口2 发送缓冲区指针clockStr内的数据 数据长度为 sizeof(clockStr) 需在200ms内传输完成。发送完成返回值为HAL_OK,否则可能是超时或其他错误
返回值有以下4种:
typedef enum
{
HAL_OK = 0x00U, //成功
HAL_ERROR = 0x01U, //错误
HAL_BUSY = 0x02U, //进行中
HAL_TIMEOUT = 0x03U //超时
} HAL_StatusTypeDef;
案例2:接收的轮询模式
uint8_t recvSTR[];
HAL_UART_Receive(&huart2, recvSTR, 10,200);
//通过串口2 接收数据放入长度为10的recvSTR数组中,如果超过200ms未完成,则返回超时,在固定时间内完成,则返回HAL_OK
1.4.2 中断/DMA模式常用功能函数
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
案例1:以中断方式发送数据
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
参数pData用于需要发送的数据缓冲区指针,参数Size是需要发送的数据长度。
通过该函数 以中断方式发送一定长度的数据,若函数返回值为 HAL_OK ,表示启动发送 成功,但并不表示数据发送完成了。
uint8_t clockStr[]="18:!45\n";
HAL_UART_Transmit_IT(&huart2, clockStr, sizeof(clockStr));
// 通过串口2 发送缓冲区指针clockStr内的数据 数据长度为 sizeof(clockStr) 无超时时间限制。
//发送完成返回值为HAL_OK,否则可能是超时或其他错误
发送结束后,会触发中断回调函数:HAL_UART_TxCpltCallback(),其作用是:若要在数据发送结束时做一些处理,就需要编写该回调函数。
案例2:以中断方式接收数据
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
参数pData是存放接收数据的缓冲区指针,参数Size是需要接收的数据长度(以字节方式)。
通过该函数 以中断方式接收一定长度的数据,若该函数返回值为 HAL_OK,表示启动接收成功,并不表示已经接收完数据。
uint8_t recvSTR[10];
HAL_UART_Receive_IT(&huart2, recvSTR, 10);
//通过串口2 接收数据放入长度为10的recvSTR数组中。
接收结束后,会触发中断回调函数:HAL_UART_RxCpltCallback(),其作用是:若要在数据接收结束时做一些处理,就需要编写该回调函数。
注意:HAL_UART_Receive_IT()该函数有需要注意的地方:
1.该函数执行一次,只能接收固定长度的数据
2.在处理不确定长度、不确定输入时间的串口数据输入时,会比较麻烦。后面案例中介绍处理方法
。
1.5 常用宏函数
1.6 中断事件及回调函数
2.电路原理图
本例程采用串口2,使用PA2(TX),PA3(RX) 分别接到 TPT3232芯片的输入和输出口。
3.配置CUBEMX
配置STM32的串口2