目录
0 实验预期效果
完成串口数据的接收和发送
1 相关原理图
2 硬件配置
DAPLINK、STM32F407VET6:
TXD —— PA10 注意!!!!一定要看清!!!不要接错!!TXD是接PA10!!!
RXD —— PA9 注意!!!!一定要看清!!!不要接错!!RXD是接PA9!!!
GND —— GND
5V —— 5V
3 软件配置
USART相关知识
USART 简介、功能说明、框图见博客:【STM32】基于STM32F407实现串口通信_Max_Shy的博客-CSDN博客_stm32f407串口通信
STM32CubeMX配置
①点击USATR1;
②设置MODE为异步通信(Asynchronous) ;
③基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit,无校验位,1位停止位 ,接收和发送都使能;
④GPIO引脚设置 USART1_RX/USART_TX;
4 代码编写
函数理解
HAL库UART函数库介绍见博客:【STM32】基于STM32F407实现串口通信_Max_Shy的博客-CSDN博客_stm32f407串口通信串口通讯知识梳理及在Stm32上的应用(HAL库)_冬瓜~的博客-CSDN博客
串口发送
打开 stm32f4xx_hal_uart.c 文件,可找到函数:
/** * @brief Sends an amount of data in blocking mode. * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), * the sent data is handled as a set of u16. In this case, Size must indicate the number * of u16 provided through pData. * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @param pData Pointer to data buffer (u8 or u16 data elements). * @param Size Amount of data elements (u8 or u16) to be sent * @param Timeout Timeout duration * @retval HAL status */ /** * @brief 串口的发送函数 * @param huart 串口句柄 * @param pData 需要发送数组的指针(必须为uint8_t型数组,因为串口是单字节发送的) * @param Size 数组的字节数 * @param Timeout 超时时间(在指定时间内未完成数据发送则返回HAL_TIMEOUT) * @retval HAL_status 返回值 HAL_OK、HAL_ERROR、HAL_BUSY、HAL_TIMEOUT */ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
第一个参数是要使用的串口句柄地址,比如要使用U(S)ART1,参数就设置为U(S)ART1的句柄地址&huart1;
第二个参数是要发送的数据缓冲区首地址;
第三个参数是发送的数据长度,这里可以直接用sizeof()函数获取发送缓冲区的长度;
第四个参数是超时时间,单位是ms,如果超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY,处理器就会一直等到数据发送完成再执行下一条语句。
串口接收
打开 stm32f4xx_hal_uart.c 文件,可找到函数:
/** * @brief Receives an amount of data in blocking mode. * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), * the received data is handled as a set of u16. In this case, Size must indicate the number * of u16 available through pData. * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @param pData Pointer to data buffer (u8 or u16 data elements). * @param Size Amount of data elements (u8 or u16) to be received. * @param Timeout Timeout duration * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
同HAL_UART_Transmit()函数一样,这个函数也有四个参数:
第一个参数是要使用的串口句柄地址,比如要使用U(S)ART1,参数就设置为U(S)ART1的句柄地址&huart1;
第二个参数是接受数据的缓冲区首地址;
第三个参数是接受的数据长度,这里可以直接用sizeof()函数获取接受缓冲区的长度;
第四个参数是超时时间,单位是ms,如果超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY,处理器就会一直等到接受到设置好的数据数量再执行下一条语句。
代码编写
int main(void)
{
/* USER CODE BEGIN 1 */
char str[12] = "Hello World\n";
char recv_buf[12] = {0};
/* USER CODE END 1 */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart1, (uint8_t*)str, 12, 0xFFFF);
/* USER CODE END 2 */
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//接收12个字节的数据,不超时
if(HAL_OK == HAL_UART_Receive(&huart1, (uint8_t*)recv_buf, 12, 0xFFFF))
{
//将接收到的数据发送
HAL_UART_Transmit(&huart1, (uint8_t*)recv_buf, 12, 0xFFFF);
}
}
/* USER CODE END 3 */
}
波特率调为115200
【本文参考博客:【STM32Cube_06】使用USART发送和接收数据(查询模式)_Mculover666的博客-CSDN博客
【STM32】基于STM32F407实现串口通信_Max_Shy的博客-CSDN博客_stm32f407串口通信
串口通讯知识梳理及在Stm32上的应用(HAL库)_冬瓜~的博客-CSDN博客
【CubeIDE】STM32 HAL库史上最详细教程(一):UART串口收发_Nack'BT的博客-CSDN博客_stm32cubeide串口通信
串口通讯知识梳理及在Stm32上的应用(HAL库)_冬瓜~的博客-CSDN博客】
【本文仅作为个人学习记录,不出于任何商业目的。】