qinch1978 2023-12-14 16:07 采纳率: 100%
浏览 7
已结题

STM32、HAL库、串口收发

STM32 HAL库函数
HAL_UART_Receive_IT
HAL_UART_Transmit_IT
HAL_UART_Receive
HAL_UART_Transmit
前两者是在非阻塞模式发送和接收
后两者是在阻塞模式进行发送和接收
用前两个的时候是不是不需要在串口中断函数中调用,可以直接写到程序中?
这与后两个写到中断程序中有没有什么区别,最好举例示范下谢谢

  • 写回答

1条回答 默认 最新

  • 小孟多 2023-12-14 16:30
    关注

    在使用STM32和HAL库进行串口收发时,可以选择使用非阻塞模式或阻塞模式。下面是对不同函数的使用说明及示例:

    HAL_UART_Receive_IT:用于在非阻塞模式下接收数据。该函数会启动接收过程,并将接收到的数据存储在缓冲区中。当数据接收完成后,会触发串口的中断回调函数(比如HAL_UART_RxCpltCallback)。 示例代码:

    uint8_t rxBuffer[10];
    
    void UART_RxCallback(UART_HandleTypeDef *huart) {
      // 数据接收完成后的处理逻辑
    }
    
    int main() {
      HAL_UART_Receive_IT(&huart, rxBuffer, sizeof(rxBuffer));
      
      while (1) {
        // 主程序中的其他逻辑
      }
    }
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
      if (huart == &huart) {
        // 处理接收完成后的数据
      }
    }
    
    
    

    在这个示例中,主程序中的while循环会一直运行,而不需要等待接收完成。当数据接收完成后,会自动触发HAL_UART_RxCpltCallback函数进行数据处理。

    HAL_UART_Transmit_IT:用于在非阻塞模式下发送数据。该函数会启动发送过程,并将数据从缓冲区发送出去。当数据发送完成后,会触发串口的中断回调函数(比如HAL_UART_TxCpltCallback)。 示例代码:

    uint8_t txBuffer[10] = "Hello";
    
    void UART_TxCallback(UART_HandleTypeDef *huart) {
      // 数据发送完成后的处理逻辑
    }
    
    int main() {
      HAL_UART_Transmit_IT(&huart, txBuffer, sizeof(txBuffer));
      
      while (1) {
        // 主程序中的其他逻辑
      }
    }
    
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
      if (huart == &huart) {
        // 处理发送完成后的逻辑
      }
    }
    
    
    

    在这个示例中,主程序中的while循环会一直运行,而不需要等待发送完成。当数据发送完成后,会自动触发HAL_UART_TxCpltCallback函数进行后续处理。

    HAL_UART_Receive:用于在阻塞模式下接收数据。该函数会阻塞主程序,直到接收到指定数量的数据为止。 示例代码:

    uint8_t rxBuffer[10];
    
    int main() {
      HAL_UART_Receive(&huart, rxBuffer, sizeof(rxBuffer), HAL_MAX_DELAY);
      
      // 数据接收完成后的处理逻辑
    }
    
    
    

    在这个示例中,主程序会一直阻塞,直到接收完成后才会继续执行后续的处理逻辑。

    HAL_UART_Transmit:用于在阻塞模式下发送数据。该函数会阻塞主程序,直到发送指定数量的数据完成。 示例代码:

    uint8_t txBuffer[10] = "Hello";
    
    int main() {
      HAL_UART_Transmit(&huart, txBuffer, sizeof(txBuffer), HAL_MAX_DELAY);
      
      // 数据发送完成后的处理逻辑
    }
    
    
    

    在这个示例中,主程序会一直阻塞,直到发送完成后才会继续执行后续的处理逻辑。

    总结:

    非阻塞模式下的数据收发函数(HAL_UART_Receive_IT和HAL_UART_Transmit_IT)可以直接写入主程序中,在数据传输完成后会自动触发相应的中断回调函数进行处理。
    阻塞模式下的数据收发函数(HAL_UART_Receive和HAL_UART_Transmit)会阻塞主程序,直到数据传输完成后才会继续执行后续的处理逻辑。
    注意:以上示例代码仅作为演示用途,实际使用时需要根据具体情况进行适当修改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月31日
  • 已采纳回答 12月23日
  • 创建了问题 12月14日

悬赏问题

  • ¥15 求ax+by=n的正整数解
  • ¥50 使用MS Log Parser查询使用Bitvise SSH Server登录的IP
  • ¥20 校园二手交易小程序搭建
  • ¥15 请问在ubuntu用conda创建环境报错怎么能解决
  • ¥15 STM32CubeMX/proteus按键控制指示灯颜色切换
  • ¥20 python,计算区位熵和扩张指数
  • ¥15 Python环境配置
  • ¥15 大四学生的困惑,有偿提问!
  • ¥15 解决页面无法编入索引:被“noindex”标签排除的问题?
  • ¥15 arduino测量电阻