91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

printf輸出重定向的方法

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

掃碼添加小助手

加入工程師交流群

前言

在 PC 上運(yùn)行 C 語(yǔ)言時(shí),prinf 輸出的內(nèi)容會(huì)打印在電腦顯示器上,這是因?yàn)?prinf 默認(rèn)的輸出設(shè)備就是顯示器。 而當(dāng)我們?cè)?a target="_blank">單片機(jī)上,需要通過(guò) printf 函數(shù)將信息打印到串口,就要對(duì) printf 函數(shù)的輸出進(jìn)行重定向。

printf 輸出重定向的方法

printf 函數(shù)聲明如下:

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

printf 函數(shù)根據(jù) format 字符串給出的格式打印輸出到 stdout(標(biāo)準(zhǔn)輸出)中,當(dāng)然,printf 函數(shù)是不會(huì)一個(gè)字符一個(gè)字符去輸出,它會(huì)調(diào)用更底層的 I/O 函數(shù)去逐個(gè)字符打印。

printf 是庫(kù)函數(shù),不同編譯器對(duì) C庫(kù)的底層實(shí)現(xiàn)機(jī)制是不同的,因此 printf 中調(diào)用了哪個(gè)底層 I/O 函數(shù)來(lái)輸出字符,需要根據(jù)當(dāng)前使用的編譯器來(lái)確定。

我們實(shí)現(xiàn) printf 輸出重定向的方法就是找到當(dāng)前使用的編譯器中,printf 調(diào)用了哪個(gè)底層 I/O 函數(shù)來(lái)輸出字符,再改寫(xiě)該函數(shù),將字符通過(guò)串口輸出。

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

Keil 為例,點(diǎn)擊菜單欄 Help ==> μVision Help 選項(xiàng),打開(kāi)幫助文檔。

如果你是51單片機(jī)項(xiàng)目,那么使用的編譯器是 Keil C51,打開(kāi)的就是 C51 的幫助文檔; 如果你是 ARM 單片機(jī)項(xiàng)目,那么使用的編譯器是 Keil MDK,打開(kāi)的就是 ARM 的幫助文檔。

查找 printf 關(guān)鍵字,可以看到 C51 的 printf 底層是調(diào)用 putchar 函數(shù)實(shí)現(xiàn)字符輸出的:

而 ARM 的 printf 函數(shù)底層是調(diào)用 fputc函數(shù)實(shí)現(xiàn)字符輸出的:

從上述的結(jié)果可知,要想通過(guò) printf 向串口打印調(diào)試信息,C51 單片機(jī)需要改寫(xiě) putchar( ) 函數(shù),而 ARM 單片機(jī)則需要改寫(xiě) fputc( ) 函數(shù)。

C51 和 ARM 項(xiàng)目中,printf 輸出重定向的方法是不一樣的,這就是有些人把 STM32 的 printf 搬到 C51 中會(huì)出錯(cuò)的原因之一。

C51 重定向 printf 輸出的注意事項(xiàng)

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

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

使用 printf 函數(shù)前,需要包含

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

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

Keil 中擴(kuò)展了 b、h、l 來(lái)設(shè)置字節(jié)寬度:

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

在 Keil C51中,用 printf 輸出一個(gè)單字節(jié)變量時(shí),要使用%bd,例如:

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

這些內(nèi)容在 Keil C51 幫助文檔關(guān)于 printf 的章節(jié)中有提到:

擴(kuò)展知識(shí)

不知道有沒(méi)小伙伴發(fā)現(xiàn),如果項(xiàng)目中沒(méi)有重寫(xiě) putchar 或 fputc 函數(shù),直接調(diào)用 printf 也不會(huì)報(bào)錯(cuò),只是 printf 打印的內(nèi)容不知道輸出到哪里罷了。

printf 函數(shù)里面調(diào)用了更加底層的 putchar 或 fputc 函數(shù)而沒(méi)有報(bào)錯(cuò),說(shuō)明在 C庫(kù)里面已經(jīng)實(shí)現(xiàn)了 putchar 或 fputc 函數(shù),那為什么我們?cè)?C庫(kù)外重新實(shí)現(xiàn) putchar 或 fputc 函數(shù)時(shí),編譯器沒(méi)有報(bào)重復(fù)定義的錯(cuò)誤呢?

這是因?yàn)樵?C庫(kù)里,putchar 或 fputc 函數(shù)被定義成了弱函數(shù)(weak),當(dāng)你定義了 putchar 或 fputc 函數(shù),那么編譯時(shí)就使用你定義的函數(shù),否則就使用 C庫(kù)中的 putchar 或 fputc 函數(shù)。

關(guān)于 C語(yǔ)言的弱函數(shù)相關(guān)內(nèi)容,這里不再展開(kāi)來(lái)講,感興趣的小伙伴可自行查閱相關(guān)資料。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45500

    瀏覽量

    670665
  • 顯示器
    +關(guān)注

    關(guān)注

    22

    文章

    5147

    瀏覽量

    144420
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145651
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1620

    瀏覽量

    82872
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    stm32系列單片機(jī)之printf重定向

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

    STM32重定向printf方法總結(jié)

    printf函數(shù)是怎樣通過(guò)串口打印信息到串口調(diào)試助手上的?怎樣去編寫(xiě)printf重定向代碼呢?
    發(fā)表于 11-30 06:21

    STM32重定向printf方法是什么?

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

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

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

    重定向printf() 函數(shù)

    ,結(jié)果是什么現(xiàn)象都沒(méi)有。要想使用這個(gè)函數(shù),常規(guī)方法重定向 printf() 函數(shù),結(jié)合串口來(lái)打印到串口助手上位機(jī)。這里的重定向就非常復(fù)雜了,你需要懂
    發(fā)表于 01-11 07:01

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

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

    重定向printf函數(shù)到串口輸出方法

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

    實(shí)現(xiàn)重定向printf()和scanf() 函數(shù)案例分析

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

    單片機(jī)printf重定向的函數(shù)免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)printf重定向的函數(shù)免費(fèi)下載。
    發(fā)表于 07-03 17:42 ?0次下載
    單片機(jī)<b class='flag-5'>printf</b><b class='flag-5'>重定向</b>的函數(shù)免費(fèi)下載

    51單片機(jī)printf重定向

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

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

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

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

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

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

    Keil下使用STlink重定向printf的配置1. printf 重定向Keil默認(rèn)下使用Micro LIB庫(kù),該庫(kù)調(diào)用 fputs 實(shí)現(xiàn) pr
    發(fā)表于 12-27 18:43 ?18次下載
    Keil下使用STlink<b class='flag-5'>重定向</b><b class='flag-5'>printf</b>的配置

    STM32單片機(jī)基礎(chǔ)09——重定向printf函數(shù)到串口輸出的多種方法

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

    如何實(shí)現(xiàn)Printf()接口重定向到UART

    ;。所謂的重定向,就是重新定義Printf()接口函數(shù)里調(diào)用的與輸出設(shè)備相關(guān)的函數(shù),eg:使用Printf()接口將MCU中的信息,通過(guò)串口或者Ethernet
    的頭像 發(fā)表于 10-01 10:13 ?2367次閱讀
    如何實(shí)現(xiàn)<b class='flag-5'>Printf</b>()接口<b class='flag-5'>重定向</b>到UART