本文主要是介绍STM32CubeMX | STM32 串口通信以及串口重定向,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、串口配置
- 管脚以及参数配置
- 使能串口中断
配置完成并保存后,点击【GENERATE CODE】重新生成代码。
二、串口发送
串口发送调用HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
函数即可。
-
定义一个存放串口数据发送的缓冲区:
/* USER CODE BEGIN 0 */ uint8_t tx_buff[]="Welcome to 羽墨志\n"; /* USER CODE END 0 */
【注】自定义添加的代码请放置于
/* xx CODE BEGIN xx */
与/* xx CODE END xx */
之间,以免在STM32CubeMX重新生成代码时被覆盖掉。 -
串口数据发送
在while循环中添加如下代码:
/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_UART_Transmit(&huart1,(uint8_t *)tx_buff,sizeof(tx_buff)-1,0xffff);HAL_Delay(1000);}/* USER CODE END 3 */
编译下载后,可以看到每隔一秒钟收到一次数据:
三、串口接收
-
定义串口数据接收缓冲区
/* USER CODE BEGIN 0 / uint8_t tx_buff[]="Welcome to 羽墨志\n"; // 串口数据发送缓冲区 uint8_t rx_buffer; // 串口数据接收缓冲区 / USER CODE END 0 */
-
使能串口中断
在main()
的初始化部分添加串口中断使能函数:/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1,(uint8_t *)&rx_buffer,1); //使能接收中断/* USER CODE END 2 */
-
重写串口中断服务函数
/*** @brief Rewrite callback function for USART1* @retval None*/ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {UNUSED(huart);if(huart->Instance == USART1)//判断串口号{HAL_UART_Transmit(&huart1,(uint8_t *)&rx_buffer,1,100); // 将接收到的数据再通过串口发送出去HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_buffer, 1); //重新使能接收中断} }
每次串口接收数据时会自动关闭串口中断,因此在中断回调函数中需要再次使能串口接收中断,一边等待下一次数据接收中断。
四、串口重定向
-
添加标准库头文件
在usart.h
文件中添加标准库头文件stdio.h
:/* USER CODE BEGIN Includes */ #include <stdio.h> /* USER CODE END Includes */
-
添加重定义函数
在usart.h
文件中添加相关的重定向函数:/* USER CODE BEGIN 1 */int fputc(int ch, FILE *fp) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch; }int fgetc(FILE *fp) {uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch; }/* USER CODE END 1 */
-
添加函数声明
在usart.h
文件中添加相关的函数声明:/* USER CODE BEGIN Prototypes */ int fputc(int ch, FILE *fp); int fgetc(FILE *fp); /* USER CODE END Prototypes */
-
测试
下main
函数的while(1)
循环中添加如下代码:/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("Hi,yomo!\n");HAL_Delay(1000);}/* USER CODE END 3 */
编译下载后就可以在串口看到一秒打印一次的串口数据了。
这篇关于STM32CubeMX | STM32 串口通信以及串口重定向的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!