HAL库串口收发

简介: HAL库串口收发

1、通讯方式介绍

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


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


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


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


2、Cubemax配置USART

1、SYS配置如下图所示。


5fa54c59858ccc0e302e35c4616077f5.png


2、RCC配置如下图所示。


01bd79eda53a6935a0ef358a25f1e20c.png


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

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


86b3a758d90ebbb899f8896f9bb6fc09.png


4、串口初始化配置。


1e2aba56ef234c20fb26aabda0c91688.png

8a27c26ba79d86bb85dc358612cd83d4.png


5、生成代码。


459c89a8989761b929e024fe6d334ca1.png

8157003d20ea0df9d800187587da14ef.png


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 */
  }

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



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

相关文章
|
6天前
【STM32】NRF24L01模块的收发调试(二)
【STM32】NRF24L01模块的收发调试
|
6天前
【STM32】NRF24L01模块的收发调试(三)
【STM32】NRF24L01模块的收发调试
|
6天前
【STM32】NRF24L01模块的收发调试(一)
【STM32】NRF24L01模块的收发调试
|
11月前
|
芯片
STM32使用HAL库实现RS485通讯(全双工串口)
STM32使用HAL库实现RS485通讯(全双工串口)
679 0
|
8月前
|
Windows 容器
Labview串口通信MSComm实现串口收发
Labview串口通信MSComm实现串口收发
79 0
|
11月前
STM32使用HAL库实现modbus的简单通讯
STM32使用HAL库实现modbus的简单通讯
204 0
|
XML 测试技术 网络安全
开发工具:USB转IIC/I2C/SPI/UART适配器模块可编程开发板
总的思路是通过USB或者UART接口发送一些协议字符串,由模块转换成上面几种接口的硬件时序电信号,实现与这几种接口芯片、设备的快速测试。 首先声明一下,大家都是搞硬件开发的,这几种接口当然是很简单的事,但有些时候对于一个新的设备或者芯片的测试,有个现成的工具当然更顺手,节省时间,也更可靠嘛。
STM32的HAL库开发系列 - 串口发送
STM32的HAL库开发系列 - 串口发送
220 0
STM32的HAL库开发系列 - 串口DMA发送
STM32的HAL库开发系列 - 串口DMA发送
168 0