在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

printf輸出重定向的方法

CHANBAEK ? 來源:猿來如此 I See ? 作者:YJer ? 2023-05-14 16:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

在 PC 上運行 C 語言時,prinf 輸出的內容會打印在電腦顯示器上,這是因為 prinf 默認的輸出設備就是顯示器。 而當我們在單片機上,需要通過 printf 函數將信息打印到串口,就要對 printf 函數的輸出進行重定向。

printf 輸出重定向的方法

printf 函數聲明如下:

int printf(const char *format, ...);

printf 函數根據 format 字符串給出的格式打印輸出到 stdout(標準輸出)中,當然,printf 函數是不會一個字符一個字符去輸出,它會調用更底層的 I/O 函數去逐個字符打印。

printf 是庫函數,不同編譯器對 C庫的底層實現機制是不同的,因此 printf 中調用了哪個底層 I/O 函數來輸出字符,需要根據當前使用的編譯器來確定。

我們實現 printf 輸出重定向的方法就是找到當前使用的編譯器中,printf 調用了哪個底層 I/O 函數來輸出字符,再改寫該函數,將字符通過串口輸出。

如何確定輸出字符的底層 I/O 函數?

Keil 為例,點擊菜單欄 Help ==> μVision Help 選項,打開幫助文檔。

如果你是51單片機項目,那么使用的編譯器是 Keil C51,打開的就是 C51 的幫助文檔; 如果你是 ARM 單片機項目,那么使用的編譯器是 Keil MDK,打開的就是 ARM 的幫助文檔。

查找 printf 關鍵字,可以看到 C51 的 printf 底層是調用 putchar 函數實現字符輸出的:

而 ARM 的 printf 函數底層是調用 fputc函數實現字符輸出的:

從上述的結果可知,要想通過 printf 向串口打印調試信息,C51 單片機需要改寫 putchar( ) 函數,而 ARM 單片機則需要改寫 fputc( ) 函數。

C51 和 ARM 項目中,printf 輸出重定向的方法是不一樣的,這就是有些人把 STM32 的 printf 搬到 C51 中會出錯的原因之一。

C51 重定向 printf 輸出的注意事項

C51 重定向 printf 函數的輸出到串口,需要改寫 putchar 函數,偽代碼如下:

char putchar (char ch)
{
SBUF0 = ch;
while( !(SCON0 & (1<<1)));
SCON0 &=~(1<<1);
return 0;
}

使用 printf 函數前,需要包含

51單片機重定向 printf 函數后,如果直接像 PC機或者是 32位單片機那樣使用 %d 占位符打印數值,輸出的數值可能是錯誤的,例如下面的代碼輸出結果可能就是不正確:

int i = 10; 
printf("%d", i);

Keil 中擴展了 b、h、l 來設置字節寬度:

  • b - 8位
  • h - 16bit (默認)
  • l - 32位

在 Keil C51中,用 printf 輸出一個單字節變量時,要使用%bd,例如:

unsigned char x = 'A'; 
printf("x: %bd\\n", x);

這些內容在 Keil C51 幫助文檔關于 printf 的章節中有提到:

擴展知識

不知道有沒小伙伴發現,如果項目中沒有重寫 putchar 或 fputc 函數,直接調用 printf 也不會報錯,只是 printf 打印的內容不知道輸出到哪里罷了。

printf 函數里面調用了更加底層的 putchar 或 fputc 函數而沒有報錯,說明在 C庫里面已經實現了 putchar 或 fputc 函數,那為什么我們在 C庫外重新實現 putchar 或 fputc 函數時,編譯器沒有報重復定義的錯誤呢?

這是因為在 C庫里,putchar 或 fputc 函數被定義成了弱函數(weak),當你定義了 putchar 或 fputc 函數,那么編譯時就使用你定義的函數,否則就使用 C庫中的 putchar 或 fputc 函數。

關于 C語言的弱函數相關內容,這里不再展開來講,感興趣的小伙伴可自行查閱相關資料。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6067

    文章

    44973

    瀏覽量

    649539
  • 顯示器
    +關注

    關注

    22

    文章

    5071

    瀏覽量

    141675
  • C語言
    +關注

    關注

    180

    文章

    7631

    瀏覽量

    141234
  • 串口
    +關注

    關注

    15

    文章

    1587

    瀏覽量

    79717
  • 函數
    +關注

    關注

    3

    文章

    4379

    瀏覽量

    64675
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    stm32系列單片機之printf重定向

    的方式有兩種,重定向至UART,或者通過JTAG的SW模式將printf重定向至SWO引腳輸出。首先介紹第一種,重定向至UART,這種方式我
    發表于 01-19 10:59

    STM32重定向printf方法總結

    printf函數是怎樣通過串口打印信息到串口調試助手上的?怎樣去編寫printf重定向代碼呢?
    發表于 11-30 06:21

    STM32重定向printf方法是什么?

    STM32重定向printf方法是什么?如何解決在TIMER2中printf只能打印double類型的整數部分?
    發表于 12-01 06:00

    如何重定向printf輸出到串口輸出

    如何重定向printf輸出到串口輸出呢?有哪幾種方法
    發表于 12-02 06:04

    重定向printf() 函數

    ,結果是什么現象都沒有。要想使用這個函數,常規方法重定向 printf() 函數,結合串口來打印到串口助手上位機。這里的重定向就非常復雜了,你需要懂
    發表于 01-11 07:01

    重定向printf輸出到串口輸出方法

    本文詳細的介紹了如何重定向printf輸出到串口輸出的多種方法,包括調用MDK微庫(MicroLib)的
    發表于 02-10 07:16

    重定向printf函數到串口輸出方法

    本文詳細的介紹了如何重定向printf輸出到串口輸出的多種方法,包括調用MDK微庫(MicroLib)的
    發表于 02-22 08:25

    實現重定向printf()和scanf() 函數案例分析

    要想printf()和scanf() 函數工作,我們需要把printf()和scanf() 重新定向到串口中。重定向是指用戶可以自己重寫C 的庫函數,當連接器檢查到用戶編寫了與C 庫函
    發表于 06-23 08:26 ?9667次閱讀
    實現<b class='flag-5'>重定向</b><b class='flag-5'>printf</b>()和scanf() 函數案例分析

    單片機printf重定向的函數免費下載

    本文檔的主要內容詳細介紹的是單片機printf重定向的函數免費下載。
    發表于 07-03 17:42 ?0次下載
    單片機<b class='flag-5'>printf</b><b class='flag-5'>重定向</b>的函數免費下載

    51單片機printf重定向

    從keil的幫助文檔里我們可以看到,printf是基于putchar實現的,所以我們只要重新實現putchar,就可以實現printf重定向,即可以將printf用在其他串口上。pu
    發表于 11-11 20:21 ?15次下載
    51單片機<b class='flag-5'>printf</b><b class='flag-5'>重定向</b>

    單片機printf( )重定向到串口

    方法一:在STM32Cube軟件生成的usart.c中加入下面的代碼就可以了/* USER CODE BEGIN 1 *//*printf() 重定向輸出到串口*/#ifdef __G
    發表于 11-29 15:06 ?2次下載
    單片機<b class='flag-5'>printf</b>( )<b class='flag-5'>重定向</b>到串口

    【STM32Cube_09】重定向printf函數到串口輸出的多種方法

    本文詳細的介紹了如何重定向printf輸出到串口輸出的多種方法,包括調用MDK微庫(MicroLib)的
    發表于 12-06 11:21 ?12次下載
    【STM32Cube_09】<b class='flag-5'>重定向</b><b class='flag-5'>printf</b>函數到串口<b class='flag-5'>輸出</b>的多種<b class='flag-5'>方法</b>

    Keil下使用STlink重定向printf的配置

    Keil下使用STlink重定向printf的配置1. printf 重定向Keil默認下使用Micro LIB庫,該庫調用 fputs 實現 pr
    發表于 12-27 18:43 ?18次下載
    Keil下使用STlink<b class='flag-5'>重定向</b><b class='flag-5'>printf</b>的配置

    STM32單片機基礎09——重定向printf函數到串口輸出的多種方法

    本文詳細的介紹了如何重定向printf輸出到串口輸出的多種方法,包括調用MDK微庫(MicroLib)的
    發表于 12-27 19:22 ?10次下載
    STM32單片機基礎09——<b class='flag-5'>重定向</b><b class='flag-5'>printf</b>函數到串口<b class='flag-5'>輸出</b>的多種<b class='flag-5'>方法</b>

    如何實現Printf()接口重定向到UART

    ;。所謂的重定向,就是重新定義Printf()接口函數里調用的與輸出設備相關的函數,eg:使用Printf()接口將MCU中的信息,通過串口或者Ethernet
    的頭像 發表于 10-01 10:13 ?1718次閱讀
    如何實現<b class='flag-5'>Printf</b>()接口<b class='flag-5'>重定向</b>到UART
    主站蜘蛛池模板: 亚洲欧美卡通 动漫 丝袜 | 免费观看午夜在线欧差毛片 | 久久涩综合 | 国产呦精品系列在线 | 美日毛片 | 色激情网 | 黄色视屏在线免费观看 | 性做久久久久久免费观看 | 男男扒开后菊惩罚 | 国产午夜免费视频片夜色 | 卡一卡二卡三国色天香永不失联 | 欧美黑人巨大日本人又爽又色 | 国产在线高清精品二区色五郎 | 波多久久夜色精品国产 | 成人国产一区二区三区 | 唯美久草 | 日本三级hd高清电影 | 美女扒开尿口给男人桶视频免费 | 天天狠天天插 | sihu影院永久在线影院 | 成人亚洲欧美 | 拍拍拍美女黄色1000视频 | aaa一级最新毛片 | 亚洲午夜大片 | 天堂资源在线 | 欧美性free | 午夜女同影院 | 黄色一级片毛片 | 美女性视频网站 | 中文字幕不卡一区 | 看天堂| 亚洲色网址 | 久久天天躁狠狠躁夜夜爽蜜月 | 国产三级日产三级日本三级 | 轻点灬大ji巴太粗太大了小说 | 天天操狠狠| 伊人久色 | 特极毛片| luxu259在线中文字幕 | 伊人网综合在线视频 | 福利天堂|