串口收发数据

1. 配置

  • 配置STM32CubeMX,“Asynchronous”为异步

    Baud Rate的设置值要与首发设备相同(异步的条件)
    如要使用中断则对NVIC进行配置

2. 发送函数

  • 重要函数:

    1
    2
    3
    4
    5
    //阻塞式发送函数(在发送过程中,暂停单片机,直到发送完毕)
    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef*huart, //所要发送给的外设、串口
    uint8_t *pDate, //指向发送数据的缓冲区
    uint16_t Size, //发送多少字节的数据
    uint32_t Timeout); //超时时间
    1
    2
    3
    4
    5
    //阻塞式发送函数(在发送过程中,暂停单片机,直到发送完毕)
    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef*huart, //所要发送给的外设、串口
    uint8_t *pDate, //指向发送数据的缓冲区
    uint16_t Size, //发送多少字节的数据
    uint32_t Timeout); //超时时间
    1
    2
    3
    4
    //非阻塞式发送函数
    HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleYtpeDef *huart,
    uint8_t *pDate,
    uint16_t Size);
    1
    2
    //发送完毕中断回调函数
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
    1
    2
    //发送一半中断回调函数
    void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
  • 发送示例:
    使用非阻塞式的串口发送函数,将发送缓数组dat_Txd中的前5个数据发送到USART1,在数据发送完成后,反转PB9引脚的输出电平。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    HAL_UART_Transmit_IT(&huart1,dat_Txd,5);
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
    {
    if(huart->Instance == USART1)
    {
    HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
    }
    }

    //另一种实现方案
    HAL_UART_Transmit(&huart1,dat_Txd,5,10000);
    HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);

3. 接收函数

  • 重要函数:

    1
    2
    3
    4
    5
    //阻塞式接收函数(在接受到数据之前单片机会一直停滞,直到接收到数据)(不推荐)
    HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,
    uint8_t *pDate,
    uint16_t Size,
    uint32_t Timeout);
    1
    2
    3
    4
    //非阻塞式接收函数(推荐)
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleYtpeDef *huart,
    uint8_t *pDate,
    uint16_t Size);
    1
    2
    //接收完毕中断回调函数
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    1
    2
    //接收一半中断回调函数
    void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
  • 接收实例:
    使用非阻塞式的串口接收函数,接收USART1中的一个字节,将其保存在dat_Rxd变量中,在数据发送完成后,若该字节为0x5A,则反转PB8引脚的输出电平。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    uint8_t dat_Rxd=0;
    HAL_UART_Transmit_IT(&huart1,&dat_Rxd,1); //放在main()函数里

    void HAL_UART_RxCpltCallback(UART_HandleTypeDer *huart) //放在main()函数外
    {
    if(huart->Instance == USART1)
    {
    if(dat_Rxd == 0x5A) //此处0x5A表示16进制输入的5A
    HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
    }
    }

这是跟随B站小蜜蜂老师的干货铺【小蜜蜂笔记】基于STM32CubeMX的嵌入式开发基础教程所写的学习笔记。

此教程以应用为主,辅以简单的原理讲解,能够快速的上手STM32的开发。