当前位置:   article > 正文

hal库实现串口通信——阻塞式 API

hal库实现串口通信——阻塞式 API

1STM32CobeMX设置

设置时钟源

rcc设置为外部时钟High Speed Clock (HSE)//设置为如图

再将其设置为72MHz

设置串口引脚为异步通信

设置波特率

设置波特率范围提示点击波特率再点击图中的

我的设置

再打开中断

即可生成代码//省略项目设置

2代码设置

函数

HAL_UART_Transmit() - 发送数据到串口。
HAL_UART_Receive() - 从串口接收数据。

解释

HAL_UART_Transmit() - 发送数据到串口。

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  • huart: 指向 UART_HandleTypeDef 结构的指针,该结构包含了 UART 的配置信息。
  • pData: 指向要发送的数据缓冲区的指针。
  • Size: 要发送的数据的字节数。
  • Timeout: 发送操作的超时时间(以毫秒为单位)。如果设置为 HAL_MAX_DELAY,则表示无限期等待。
  • 返回值: 函数执行状态(HAL_OK 表示成功,HAL_ERROR 表示错误,HAL_BUSY 表示忙,HAL_TIMEOUT 表示超时)。

HAL_UART_Receive() - 从串口接收数据。

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  • huart: 指向 UART_HandleTypeDef 结构的指针,该结构包含了 UART 的配置信息。
  • pData: 指向用于接收数据的缓冲区的指针。
  • Size: 要接收的数据的字节数。
  • Timeout: 接收操作的超时时间(以毫秒为单位)。如果设置为 HAL_MAX_DELAY,则表示无限期等待。
  • 返回值: 函数执行状态(HAL_OK 表示成功,HAL_ERROR 表示错误,HAL_BUSY 表示忙,HAL_TIMEOUT 表示超时)。

这些函数在发送或接收数据时会阻塞,直到操作完成或发生超时。因此,在调用这些函数时,应该确保 UART 已经正确初始化,并且 pData 和 Size 参数指定了正确的数据缓冲区和大小。超时参数 Timeout 可以用来避免在通信问题导致数据无法发送或接收时无限期地等待。

当您使用 HAL_UART_Transmit() 和 HAL_UART_Receive() 函数时,您不需要手动检测是否有数据写入或读取,因为这些函数会自动处理数据的发送和接收。

实例解释

发送数据实例

  1. #include "stm32f1xx_hal.h"
  2. UART_HandleTypeDef huart; // 假设这是您的UART句柄
  3. int main(void)
  4. {
  5. HAL_Init(); // 初始化HAL库
  6. SystemClock_Config(); // 配置系统时钟
  7. MX_USART2_UART_Init(); // 初始化UART
  8. uint8_t txData[] = "Hello, World!"; // 要发送的数据
  9. uint16_t size = sizeof(txData) - 1; // 发送数据的大小(减1是为了排除字符串末尾的'\0')
  10. // 发送数据
  11. if (HAL_UART_Transmit(&huart, txData, size, HAL_MAX_DELAY) != HAL_OK)
  12. {
  13. // 发送失败的处理
  14. Error_Handler();
  15. }
  16. // ... 其他代码 ...
  17. while (1)
  18. {
  19. // 主循环
  20. }
  21. }

接收数据实例

  1. #include "stm32f1xx_hal.h"
  2. UART_HandleTypeDef huart; // 假设这是您的UART句柄
  3. int main(void)
  4. {
  5. HAL_Init(); // 初始化HAL库
  6. SystemClock_Config(); // 配置系统时钟
  7. MX_USART2_UART_Init(); // 初始化UART
  8. uint8_t rxData[32]; // 接收数据的缓冲区
  9. uint16_t size = sizeof(rxData); // 接收缓冲区的大小
  10. // 接收数据
  11. if (HAL_UART_Receive(&huart, rxData, size, 5000) != HAL_OK)
  12. {
  13. // 接收失败的处理
  14. Error_Handler();
  15. }
  16. // 处理接收到的数据
  17. // ...
  18. while (1)
  19. {
  20. // 主循环
  21. }
  22. }

用proteus8 实现串口

使用虚拟串口连接

stm32设置

里面的时钟值为stm32最终输出的值下图的值

串口图

串口设置

总结

HAL_UART_Transmit() - 发送数据到串口。
HAL_UART_Receive() - 从串口接收数据。

此函数会一直消耗系统内核资源,处于一直检测状态

使用sizeof();计算数组个数

调用的数组为指针类型//改变类型时记得转换

Proteus  8的stm32的时钟源为最终分频倍频之后的频率

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/422220
推荐阅读
相关标签
  

闽ICP备14008679号