在IAR等嵌入式開發環境中,`printf()`無輸出而`sprintf()`正常,這是因為兩者輸出目標本質不同,且嵌入式環境需手動實現底層輸出接口。
| 函數 | 輸出目標 | 典型用途 |
|---|---|---|
| `printf()` | 標準輸出設備(stdout),通常映射到**串口/UART/ITM/SWO**等調試接口 | 調試打印、日志輸出 |
| `sprintf()` | **內存字符數組**(緩衝區) | 字符串格式化組裝、構建指令/協議數據包 |
// IAR 需重寫 __write 或 putchar
size_t __write(int handle, const unsigned char *buf, size_t bufSize) {
if (handle == _LLIO_STDOUT || handle == _LLIO_STDERR) {
for (size_t i = 0; i < bufSize; i++) {
UART_SendByte(buf[i]); // 你的UART發送單字節函數
}
return bufSize;
}
return _LLIO_ERROR;
}
IAR項目選項 → General Options → Library Configuration → 選擇 `Semihosted`,輸出重定向到調試器控制台(需J-Link等支持)。
char buf[128];
sprintf(buf, "Value: %d\n", sensor_val);
UART_SendString(buf); // 你的字符串發送函數
這繞過標準庫輸出,直接用已驗證的串口發送函數,最直接可靠。
嵌入式開發中,標準庫I/O重定向是必修課,搞定它,`printf`/`scanf`全家桶即刻好用。