试发 printf重定向(串口)(HAL库)


啊,因为是萌新,所以先发一条地球人都能明白的重定向功能叭。

本来躺在stdio.h下舒适地使用printf与scanf的我们在进入了串口上位机时,便不得不使用类似于Transmit与Receive这样带着前后缀不方便记忆还有着一大长串的格式的函数来进行数据的收发。那么为了解决这个问题,便使用到重定向将数据收发的函数封装到自己的函数中,以此简化我们使用时所需要的遵循的步骤。实质上就是利用类似于自定义函数来重新封装现有的“复杂”函数罢了,达到一个方便编程的效果,事实上能熟练使用寄存器的大佬(不是我)能用更好的方法来解决这些问题。

这边使用到的是HAL库,配置什么的大家随意,打开串口一以便调试。

那么,在usart.c文件中开始重定向吧!
首先要加上include,不加这个是会报一堆错误的,很多初学者都会忽略这个问题。

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */

然后就可以在下方添加重定向的程序了:

/* USER CODE BEGIN 1 */
int fputc(int ch,FILE * f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
	return ch;
}
int fgetc(FILE * f)
{
	uint8_t ch=0;
	HAL_UART_Receive(&huart1,&ch,1,0xffff);
	return ch;
}
/* USER CODE END 1 */

这边要注意的是,我的重定向只适用于串口一,这可以从&huart1中看出来。这代表假如你用串口二进行数据收发,那么printf与scanf便没有任何用处。
现在回到main.c,同样添加上#include "stdio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

你会发现,你已然可以使用printf与scanf来进行串口一的数据收发了~
倘若涉及到多个串口的数据收发问题,你可以自定义一些函数来配置到各个串口的数据收发功能上,过程与上同理,并不难理解。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM