你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何使用CubeMX实现STM32的串口通信以及对printf等函数的重定向

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:03
串口UART,作为基础的一种通信协议应该是我们接触的最早的通信协议,有许多芯片和模块可以利用串口来进行通信。
本期我们介绍如何使用CubeMX实现STM32的串口通信以及对printf等函数的重定向。

微信图片_20240615130239.png


微信图片_20240615130232.png

首先打开CubeMX,配置时钟树和时钟源。

微信图片_20240615130228.png

接着配置我们的串口,设置相对应的波特率。

微信图片_20240615130224.png

打开串口的中断。

然后创建工程。

微信图片_20240615130221.png

在魔术棒中勾选Use MicroLIB
  1. unsigned char ReciveBuffer;
复制代码

在全局定义一个缓存用以存储中断接收到的数据。

  1. HAL_UART_Receive_IT(&huart1,&ReciveBuffer,sizeof(ReciveBuffer));
复制代码

初始化的时候需要启动串口中断。
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.     if (huart->Instance == USART1)  // 判断是哪个UART触发了中断
  4.     {
  5.         // 处理接收到的数据
  6.         HAL_UART_Transmit(&huart1,&ReciveBuffer,sizeof(ReciveBuffer),0);//将接收到的数据发送出去
  7.         // 可以再次启动中断接收
  8.         HAL_UART_Receive_IT(huart, &ReciveBuffer, sizeof(ReciveBuffer));
  9.     }
  10. }
复制代码

接着编写串口的中断回调函数,我们将接收到的数据发送回PC机。

微信图片_20240615130217.png

可以看到,我们发送的数据被原原本本的发送回来了。

串口的重定向

重定向在计算机科学中是一个常见概念,特别是在操作系统和编程语言中。在C语言中,标准输入输出库(stdio.h)提供了标准的输入输出流,如 stdin, stdout, 和 stderr。这些流默认连接到键盘和显示屏(或者命令行控制台),但是C语言也提供了机制来重定向这些流到其他的输入输出源,比如文件、管道或者其他设备。

串口的重定向可以非常方便的让我们解决发送的格式问题,可以看到,其实使用HAL_UART_Transmit发送文本是比较麻烦的,C语言的标准库中有printf函数可以方便的让我们实现指定格式的发送,那么如何将printf函数和串口结合到一起呢?
  1. #include <stdio.h>
复制代码

我们首先需要导入C语言标准输入输出库,这样子我们就可以使用printf函数了。

通过重写 fputc 函数,可以控制 printf 函数的输出,因为 printf 最终会调用 fputc 来逐个字符地写入输出。通过将这些字符发送到串口,实现了将标准输出重定向到串口的目的。
  1. int fputc(int ch, FILE *f) {
  2.     // 发送单个字符
  3.     HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  4.    
  5.     // 返回发送的字符
  6.     return ch;
  7. }
复制代码
  1. while (1)
  2.   {
  3.     /* USER CODE END WHILE */
  4.     printf("Hello\r\n");
  5.     /* USER CODE BEGIN 3 */
  6.   }
  7.   /* USER CODE END 3 */
复制代码

微信图片_20240615130212.png


正弦波
  1. while (1)
  2.   {
  3.     float t = 0;
  4.     /* USER CODE END WHILE */
  5.     printf("A:%lf\r\n",sin(t));//正弦波
  6.     t+=0.01;
  7.     /* USER CODE BEGIN 3 */
  8.   }
复制代码

微信图片_20240615130207.png


正弦波相加
  1. while (1)
  2.   {
  3.     static float t = 0;
  4.     /* USER CODE END WHILE */
  5.     printf("A:%lf\r\n",sin(t)+sin(10*t));//正弦波相加
  6.     t+=0.01;
  7.     /* USER CODE BEGIN 3 */
  8.   }
复制代码

微信图片_20240615130159.png


正弦波相乘
  1. while (1)
  2.   {
  3.     static float t = 0;
  4.     /* USER CODE END WHILE */
  5.     printf("A:%lf\r\n",sin(t)*sin(100*t));
  6.     t+=0.001;
  7.     /* USER CODE BEGIN 3 */
  8.   }
复制代码

微信图片_20240615130130.png

转载自: 电路小白

如有侵权请联系删除






收藏 评论0 发布时间:2024-6-15 13:03

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版