HAL库串口收发

1、通讯方式介绍

在微处理器和外部通信模块之间主要有并行通信和串行通信两种。并行通讯传输速率快,但是占用引脚较多,串行通信与之相反。串行通讯分别有单工、半双工、全双工三种模式。

  1. 单工:只能发送数据或者只能接收数据。

  1. 半双工:既可以发送又可以接收,但是某一时刻只能处于单一模式(发送或者接收),例如RS485通讯方式。

  1. 全双工:任意时刻都可以发送或者接收数据。(串口采用异步串行通信)

2、Cubemax配置USART

1、SYS配置如下图所示。

HAL库串口收发_第1张图片

2、RCC配置如下图所示。

HAL库串口收发_第2张图片

3、时钟树配置如下图所示。

直接在红框内输入下方数值,回车确定即可自动对时钟树进行配置。

HAL库串口收发_第3张图片

4、串口初始化配置。

HAL库串口收发_第4张图片
HAL库串口收发_第5张图片

5、生成代码。

HAL库串口收发_第6张图片
HAL库串口收发_第7张图片

3、程序书写

3.1发送函数

阻塞式发送函数:数据发完程序才能继续运行(推荐初学者使用

HAL_UART_Transmit(UART_HandleTypeDef *huart,
                   uint8_t *pData, 
                   uint16_t Size,
                   uint32_t Timeout
)

示例程序如下所示:

uint8_t buf[] = "123";
HAL_UART_Transmit(&huart1,buf,sizeof(buf),100);

非阻塞式发送函数:数据发完程序才能继续运行(串口中断)

HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, 
                     uint8_t *pData, 
                     uint16_t Size
)

发送完会进入如下回调函数。

 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
}

通过重映射可以进行printf数据的发送,需要在函数中加入重映射程序,代码如下所示。

#include "stdio.h"
int fputc(int ch, FILE *f)
{
 uint8_t temp[1] = {ch};
 HAL_UART_Transmit(&huart1, temp, 1, 2);
 //HAL_UART_Transmit(&huart2, temp, 1, 2);
 return ch;
}

3.2接收函数

阻塞式接收函数:数据接收完程序才能继续运行

HAL_UART_Receive(UART_HandleTypeDef *huart, 
                 uint8_t *pData, 
                 uint16_t Size, 
                 uint32_t Timeout
)

非阻塞式接收函数:数据发完程序才能继续运行(推荐使用

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, 
                    uint8_t *pData, 
                    uint16_t Size
)

接收完成完会进入如下回调函数。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
}

示例程序如下所示。

/* USER CODE BEGIN PTD */
//在主函数上方
uint8_t buf[] = "123";
char revebuf;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART2){
        HAL_UART_Transmit(&huart2,buf,sizeof(buf),100);
    }
}
/* USER CODE END PTD */
while (1)
  {
   HAL_UART_Receive_IT(&huart1,(uint8_t *)&revebuf,sizeof(revebuf));
        
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

串口助手接收结果如下所示。

HAL库串口收发_第8张图片

以上如有错误恳请各位大佬指正。

你可能感兴趣的:(嵌入式小项目,单片机,嵌入式硬件)