printf uart
时间: 2025-01-01 17:31:25 浏览: 21
### 通过 UART 使用 `printf` 函数进行串口打印
为了使 `printf` 函数能够通过 UART 发送数据,在嵌入式系统中通常需要重新定义标准库中的 `putchar()` 函数,以便将其输出定向到特定的硬件接口。以下是具体实现方式:
#### 修改 `putchar` 实现重映射
当程序调用 `printf` 输出字符时,默认会调用底层的 `putchar` 来逐个处理这些字符。因此可以在项目源码里覆盖默认版本,让其指向自定义的函数来完成实际的数据传输操作。
```c
#include "stm32f1xx_hal.h" // 假设基于STM32F1系列单片机开发环境
// 定义新的putchar用于替换原生C库里的同名函数
int __io_putchar(int ch){
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
```
上述代码片段展示了如何针对 STM32 平台下的 HAL 库编写一个简单的 `__io_putchar` 函数[^4]。这里假设已经初始化好了一个名为 huart1 的 UART 句柄对象,并且该句柄配置正确无误地连接到了物理上的 TX 引脚上准备就绪等待发送指令到来。
#### 初始化 UART 接口并测试功能
确保在应用程序启动初期完成了必要的外设设置工作之后再尝试执行任何 I/O 操作。下面给出一段完整的例子用来验证整个流程是否正常运作:
```c
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1) {
printf("Hello World via UART!\r\n");
HAL_Delay(1000);
}
}
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600; // 设置波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B;// 字符长度为8位
huart1.Init.StopBits = UART_STOPBITS_1; // 停止位数为1
huart1.Init.Parity = UART_PARITY_NONE; // 不使用奇偶校验
huart1.Init.Mode = UART_MODE_TX_RX; // 启用接收和发送模式
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 关闭硬件流控制
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
}
```
这段代码实现了基本的功能——每秒钟一次向终端设备发送字符串消息 “Hello World via UART!” 。注意这里的延时函数 `HAL_Delay()` 是由 ST 提供的标准外设驱动的一部分;如果采用其他厂商的产品,则需相应调整这部分逻辑以匹配具体的 SDK 或者 API 设计规范[^2]。
阅读全文