目录
3.利用串口重定向功能实现printf函数
1.简介
在HAL库中我们想实现串口发送数据的功能时常用HAL_UART_Transmit() sprintf()这两个函数实现串口发送数据的功能,但在C语言中我们学习过printf这个函数,可以直接将所需要打印的数据打印在显示端,但由于在HAL库中是没有printf这个函数的,所以我们计划用重定向功能实现在HAL库中实现printf的功能
2.传统方法
进入HAL库先配置我们每次都要配置的高速时钟,选择我们的外部高速时钟
然后选择调试方式,选Serial Wire以便我们stlink的烧录
接下来配置我们的串口,选择串口一,模式选择异步通信,
然后选择波特率和接受位和检验位(对串口通信基本原理不懂的可以看我前面的文章),然后ctrl+s进入代码编写界面
进入代码编写界面后编写sprintf函数将我们需要发送的数值30 36存储到DTH11_BUF这个数组中(这个数组需要自行在上面定义),然后利用HAL_USART_Transmit()函数将存储在DTH11_BUF中的数据通过串口一发送出去,写好程序后将程序烧写到单片机里面去。
while (1)
{
/* USER CODE END WHILE */
sprintf(DHT11_BUF,"H2:%2d T2:%2d \n",30,36);
HAL_UART_Transmit(&huart1,DHT11_BUF, strlen(DHT11_BUF), 1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
我们打开串口调试工具(如果需要串口调试工具可以私信我发),先选择正确的串口号和与单片机相同的波特率校验位和数据位,而选择串口号的方式也很简单,插拔CH340看新增的串口号,新增的那个串口号就是我们设备对应的串口号,然后接受方式选择ASCII值,然后我们就会收到单片机发送的数据,我们可以看到的是单片机发送数据间隔很小,数据也是我们刚才写的,所以证明结合HAL_UART_Transmit()和 sprintf()可以实现单片机的数据发送,这是我们的传统方式,接下来我们介绍重定向后利用printf来代替HAL_UART_Transmit()和 sprintf()
要用重定向功能 ,那我们就要先明白重定向是上面意思,我们可以通俗的理解为,在HAL库中我们并没有printf这个函数,但我们又想用这个函数实现一定的功能,为了能使用这个函数,我们用一定的“手法”,在HAL中实现了Printf函数的功能
3.利用串口重定向功能实现printf函数
首先找到usart.c文件
然后在文件在文件的24行(也不一定在24行只要在BEGIN END对里面就可以了)定义一个数组,起名叫u_buf
然后右键#include "usart.h" 弹出框图后点击Open Declaration
然后就会跳转到“usart.h"文件中去,然后将下列代码写入.h文件中我用红色框框出来的地方,这样就可以实现我们的串口重定向功能了
extern uint8_t u_buf[256];
#define printf(...) HAL_UART_Transmit(&huart1,(uint8_t *)u_buf, sprintf((char*)u_buf,__VA_ARGS__), 0xffff);
然后我们在主函数中写下printf函数
while (1)
{
/* USER CODE END WHILE */
printf("H2:%2d T2:%2d \n"30,36);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
然后我们继续烧录程序到单片机并打开串口调试软件,然后发现数据和我们使用传统方法得到的数据是一样的,这证明我们的重定向功能实现成功,我们成功的实现了printf函数的功能,和用printf函数代替了HAL_UART_Transmit() sprintf()这两个函数的功能。
至于那几句代码是什么意思,我只给出我的理解有可能不对,但初学者只要会用就好 如果想深入可以结合gpt一起学习