試發 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