1、通讯方式介绍
在微处理器和外部通信模块之间主要有并行通信和串行通信两种。并行通讯传输速率快,但是占用引脚较多,串行通信与之相反。串行通讯分别有单工、半双工、全双工三种模式。
1.单工:只能发送数据或者只能接收数据。
2.半双工:既可以发送又可以接收,但是某一时刻只能处于单一模式(发送或者接收),例如RS485通讯方式。
3.全双工:任意时刻都可以发送或者接收数据。(串口采用异步串行通信)
2、Cubemax配置USART
1、SYS配置如下图所示。
2、RCC配置如下图所示。
3、时钟树配置如下图所示。
直接在红框内输入下方数值,回车确定即可自动对时钟树进行配置。
4、串口初始化配置。
5、生成代码。
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 */ }
串口助手接收结果如下所示。
以上如有错误恳请各位大佬指正。