色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

【經驗分享】單片機中如何實現printf輸出log?

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-12-08 08:42 ? 次閱讀

【經驗分享】C51單片機中如何實現printf輸出log?

你在真實的項目工程開發中,有考慮過在類似C51單片機中實現printf輸出log嗎?本文給出一種參考實現。

1 需求說明2 源碼實現2.1 函數申明2.2 功能實現3 源碼測試4 小小總結5 更多分享

1 需求說明

這個需求比較簡單,就是要在C51單片機中實現printf函數,并使用它來打印輸出常用的幾種類型的數據,比如整型數據,字符串數據等等。

2 源碼實現

2.1 函數申明

通過查看man幫助,我們可以知道printf函數的功能及其簡要申明。

?

2.2 功能實現

以下是我的一個簡單實現源碼,僅供參考:

?
 #include 
 #include "log.h"
 #include "stdarg.h"
 #include "types.h"
 ?
 static  xdata char  Simple_Prn_Buf[6]; 
 uchar Align_Bit = 0;
 ?
 void Dark_Fill_String(void)
 {
     unsigned char i, j;
 ?
     j = 4;
     for(i=0;i<5;i++)
     {
         if (Simple_Prn_Buf[i] != '0')
         {
             j = i;
             break;
         }
     }
 ?
     if (j != 0)
     {
         for (i=j;i<6;i++)
             Simple_Prn_Buf[i-j] = Simple_Prn_Buf[i];
     }
     
     j = strlen(Simple_Prn_Buf);
 ?
     if (Align_Bit>j)
     {
         for (i=0;i1;i++)
             Simple_Prn_Buf[Align_Bit-i] = Simple_Prn_Buf[j-i];
 ?
         for (i=0;i'0';
     }
 }
 ?
 void IntToStr(int Int_Data)
 {
     unsigned char i;
     int Shang, Div_Data;
 ?
     Shang = Int_Data;
     Div_Data = 10000;
 ?
     for(i=0;i<5;i++)
     {
         Simple_Prn_Buf[i] = Shang / Div_Data + '0';
         Shang = Shang % Div_Data;
         Div_Data /= 10;
     }
     Simple_Prn_Buf[5] = '';
     Dark_Fill_String();
 }
 ?
 void HexToStr(int Int_Data, unsigned char x)
 {
     unsigned char i;
 ?
     if (Int_Data == 0) {
         if (Align_Bit == 0) {
             Align_Bit = 1;
         } 
         memset(Simple_Prn_Buf, '0', Align_Bit);
         Simple_Prn_Buf[Align_Bit] = '';
         return;
     }
 ?
     x = (x) ? 'A' : 'a';
 ?
     for (i=0;i<4;i++)
     {
         Simple_Prn_Buf[i] = ((Int_Data >> (3-i)*4)) & 0x000F;
 ?
         if (Simple_Prn_Buf[i] > 9)
             Simple_Prn_Buf[i] += (x - 10);
         else
             Simple_Prn_Buf[i] += '0';
     }
 ?
     Simple_Prn_Buf[4] = '';
     Dark_Fill_String(); 
 }
 ?
 int xprintf(char *fmt, ...)
 {
     char *Str;
     int  Int_Data;
     uchar Fill_Flag = 0;
 ?
     va_list ap;
     va_start(ap, fmt);
 ?
     while(*fmt)
     {
         if ((*fmt != '%') && (Fill_Flag == 0))
         {
             Push_To_TX_Buffer(*fmt++);
             continue;
         }
 ?
         if (*fmt == '%')
         {
             fmt++;
             Align_Bit = 0;
             Fill_Flag = 1;
         }
         
         switch(*fmt)
         {
             case 's':
                  Str = va_arg(ap, char *);
                  for (; *Str; Str++)
                     Push_To_TX_Buffer(*Str);
                  Fill_Flag = 0;
                  Align_Bit = 0;
                  break;
 ?
             case 'd':
                  Int_Data = va_arg(ap, int);
                  IntToStr(Int_Data);
                  for (Str=Simple_Prn_Buf; *Str; Str++) {
                     Push_To_TX_Buffer(*Str);
                  }
                  Fill_Flag = 0;
                  Align_Bit = 0;
                  break;
 ?
             case 'x':
                  Int_Data = va_arg(ap, int);
                  HexToStr(Int_Data, 0); //小寫
                  for (Str=Simple_Prn_Buf; *Str; Str++) {
                     Push_To_TX_Buffer(*Str);
                  }
                  Fill_Flag = 0;
                  Align_Bit = 0;
                  break;
 ?
             case 'X':
                  Int_Data = va_arg(ap, int);
                  HexToStr(Int_Data, 1); //大寫
                  for (Str=Simple_Prn_Buf; *Str; Str++) {
                     Push_To_TX_Buffer(*Str);
                  }
                  Fill_Flag = 0;
                  Align_Bit = 0;
                  break;
 ?
             default:
                  //Push_To_TX_Buffer(*fmt);
                  Align_Bit = *fmt - '0';
                  if (Align_Bit > 9)
                     Align_Bit = 9;
                  break;
         }
         fmt++;
     }
     va_end(ap);
 ?
     return 0;
 }
 ?

3 源碼測試

簡單的測試代碼如下:

#include 
 #include 
 #include 
 ?
 extern int xprintf(const char* format, ...);
 ?
 #define LOG(fmt, arg...)xprintf(fmt, ##arg)
 ?
 int main(int argc, const char *argv[])
 {
 //uart_init();
     
 #if 1
 puts("Hello World

");/*
 unsigned int size1 = sizeof(char *);
 unsigned int size2 = sizeof(int *);
 unsigned int size3 = sizeof(int);
 unsigned int size4 = sizeof(short int);
 size = sizeof(int);
 printf("sizeof int = %d
", size);
 size = sizeof(short int);
 printf("sizeof short int = %d
", size);*/
 uart2_send_string("Hello World

");
 uart1_send_string("



");
 uart1_send_string("



");
 LOG("1Test log

");
 LOG("2Test log %c

", '=');
 LOG("3Test log %s %s

", "123", "098");
 LOG("4--Test log %d

", -456);
 LOG("4Test log %d

", 456);
 LOG("5Test log %u

", 789);
 LOG("6Test log %x

", 0x12);
 LOG("6Test log %x

", 0x1A);
 LOG("6Test log %x

", 0x1A);
 LOG("6Test log %x

", 0x1B);
 LOG("6Test log %x

", 0xab);
 LOG("6Test log %x

", 0xAB);
 LOG("6Test log %x

", 0x01);
 LOG("6Test log %2x

", 0x01);
 LOG("6Test log %x

", 0x00);
 LOG("6Test log %2x

", 0x00);
 #endif
 ?
 return 0;
 }

感興趣的朋友可以把這段測試代碼,在C51平臺上編譯運行下,相信它會給你驚喜的!

4 小小總結

printf函數看似很常用,但是真正到了要自己去實現它的時候,你又會發現其實還是蠻多東西需要考慮的。

同時,即便是本文中的實現,還是有些類型的數據是不支持輸出的,比如 long int 類型這種,就比較難輸出;還有 float類型這種數據,也是沒法輸出的。

看到這里,你是否還有更好的實現方案呢?

5 更多分享

[架構師李肯]

架構師李肯全網同名 ),一個專注于嵌入式IoT領域的架構師。有著近10年的嵌入式一線開發經驗,深耕IoT領域多年,熟知IoT領域的業務發展,深度掌握IoT領域的相關技術棧,包括但不限于主流RTOS內核的實現及其移植、硬件驅動移植開發、網絡通訊協議開發、編譯構建原理及其實現、底層匯編及編譯原理、編譯優化及代碼重構、主流IoT云平臺的對接、嵌入式IoT系統的架構設計等等。擁有多項IoT領域的發明專利,熱衷于技術分享,有多年撰寫技術博客的經驗積累,連續多月獲得RT-Thread官方技術社區原創技術博文優秀獎,榮獲[CSDN博客專家]、[CSDN物聯網領域優質創作者]、[2021年度CSDN&RT-Thread技術社區之星]、[2022年RT-Thread全球技術大會講師]、[RT-Thread官方嵌入式開源社區認證專家]、[RT-Thread 2021年度論壇之星TOP4]、[華為云云享專家(嵌入式物聯網架構設計師)]等榮譽。堅信【知識改變命運,技術改變世界】!

審核編輯:湯梓紅

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

    關注

    6052

    文章

    44764

    瀏覽量

    642750
  • 函數
    +關注

    關注

    3

    文章

    4359

    瀏覽量

    63486
  • Printf
    +關注

    關注

    0

    文章

    83

    瀏覽量

    13912
收藏 0人收藏
  • jf_650401411
  • szullc1

評論

相關推薦

有哪幾種辦法可實現單片機像在pc終端一樣打印log

有哪幾種辦法可實現單片機像在pc終端一樣打印log呢?stm32實現printf打印log的辦法
發表于 12-01 06:39

單片機如何控制調試信息輸出

單片機調試log信息輸出控制方法因子最近在研發公司項目:基于無線通信的****物聯網應用。過程涉及到了多個程序模塊,包括MQTT、JSON解析、二維碼生成等。在
發表于 01-27 07:18

基于STM8L15x單片機的串口printf輸出程序分享

本文主要詳細介紹了基于STM8L15x單片機的串口printf輸出,具體的跟隨小編一起來了解一下。
的頭像 發表于 09-24 09:44 ?5638次閱讀

如何使用單片機printf

1. 如c語言同:printf(“”);在控制臺就會輸出“”的內容; 2. 通過串口輸出:只需要在初始化串口后,直接使用printf
發表于 10-29 15:48 ?3370次閱讀
如何使用<b class='flag-5'>單片機</b><b class='flag-5'>中</b><b class='flag-5'>printf</b>

如何在Keil中使用51單片機進行printf串口輸出

最近有同學在51單片機的學習過程困擾如何使用單片機串口在上位串口助手上輸出顯示的問題,其實很多開發環境都支持使用C語言里面最常用的
發表于 08-13 17:32 ?15次下載
如何在Keil中使用51<b class='flag-5'>單片機</b>進行<b class='flag-5'>printf</b>串口<b class='flag-5'>輸出</b>

如何使用單片機系統重寫printf函數

本文檔的主要內容詳細介紹的是如何使用單片機系統重寫printf函數。
發表于 07-23 17:37 ?1次下載
如何使用<b class='flag-5'>單片機</b>系統重寫<b class='flag-5'>printf</b>函數

單片機printf的移植過程資料免費下載

大都是51單片機的,說的是在51單片機編譯軟件庫中有自帶printf函數,也有自己實現一個自己的printf函數的,但是講的不詳細,看了好幾
發表于 07-19 17:37 ?2次下載
<b class='flag-5'>單片機</b><b class='flag-5'>printf</b>的移植過程資料免費下載

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

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

AVR單片機使用printf的方法

Pro2、程序編寫要想在AVR單片機中使用printf函數,首先得包含頭文件<stdio.h>,其次,得在函數定義put...
發表于 11-14 20:36 ?8次下載
AVR<b class='flag-5'>單片機</b>使用<b class='flag-5'>printf</b>的方法

單片機printf函數的重映射

單片機printf函數的重映射一、源自于:大俠有話說1.如果你在學習單片機之前學過C語言,那么一定知道printf這個函數.它最最好用的功
發表于 11-15 20:51 ?11次下載
<b class='flag-5'>單片機</b><b class='flag-5'>中</b><b class='flag-5'>printf</b>函數的重映射

51單片機串口通信調試printf函數重定向輸出打印

51單片機串口通信以及printf調試串行通信1.串口初始化串口工作方式波特率設置通過軟件直接生成串口初始化代碼2.輸出到串口3.發送字符串到串口4.printf重定向到串口5.補充
發表于 11-20 16:36 ?16次下載
51<b class='flag-5'>單片機</b>串口通信調試<b class='flag-5'>printf</b>函數重定向<b class='flag-5'>輸出</b>打印

單片機控制調試信息輸出的方法

單片機調試log信息輸出控制方法因子最近在研發公司項目:基于無線通信的****物聯網應用。過程涉及到了多個程序模塊,包括MQTT、JSON解析、二維碼生成等。在
發表于 12-03 12:06 ?0次下載
<b class='flag-5'>單片機</b>控制調試信息<b class='flag-5'>輸出</b>的方法

單片機實現 printf 打印輸出,和電腦端一樣用

在學C語言時 printf 很好用,到了單片機時卻不能用,那因為 printf 在庫驅動是答應到顯示屏的,所用我們把驅動重新定向打印到串口就可以在
發表于 12-17 18:32 ?1次下載
<b class='flag-5'>單片機</b><b class='flag-5'>實現</b> <b class='flag-5'>printf</b> 打印<b class='flag-5'>輸出</b>,和電腦端一樣用

stm32單片機串口使用printf及u3_printf

外部設備與單片機連接的時候使用的是串口(通常物聯網用到的ESP8266,SIM9600等都是通過串口發送AT指令進行模式的配置的),但是printf函數卻只有一個。在單片機
發表于 12-27 19:24 ?1次下載
stm32<b class='flag-5'>單片機</b>串口使用<b class='flag-5'>printf</b>及u3_<b class='flag-5'>printf</b>

51單片機為什么很少出現printf的身影

51單片機為什么很少出現 printf 的身影?是用不了嗎? 不是的,51單片機可以用 printf,只是不建議使用。 平時我們在操作系統
的頭像 發表于 12-03 10:46 ?876次閱讀
51<b class='flag-5'>單片機</b><b class='flag-5'>中</b>為什么很少出現<b class='flag-5'>printf</b>的身影
主站蜘蛛池模板: a一级毛片视频免费看 | 国产传媒18精品免费观看 | 女同志videos最新另 | 91区国产福利在线观看午夜 | 亚洲精品无码一区二区三区四虎 | 啪啪漫画无遮挡全彩h同人 啪啪激情婷婷久久婷婷色五月 | 久久99精品国产99久久6男男 | 范冰冰hdxxxx | 俄罗斯黄色大片 | 韩国电影real在线观看完整版 | 777ZYZ玖玖资源站最稳定网址 | 久久久影院亚洲精品 | 日韩精品欧美亚洲高清有无 | 国产精品99AV在线观看 | 高清mv视频免费观看 | 日日射夜夜干夜夜插在线播放 | 午夜DV内射一区二区 | 国产精品成人免费观看 | 爆乳啪啪无码成人二区亚洲欧美 | 晚夜免费禁用十大亏亏 | 亚洲一二三产品区别在哪里 | 在线 日韩 欧美 国产 社区 | 嫩草亚洲国产精品 | 国精产品999一区二区三区有限 | av女优快播| 精品高潮呻吟99AV无码 | 最近韩国HD免费观看国语 | 韩国伦理片2018在线播放免费观看 | 成人午夜精品无码区久久漫画日本 | 永久免费的无码中文字幕 | 伊人国产在线观看 | 超级最爽的乱淫片免费 | 精品国产原创在线观看视频 | 无限资源好看片2019免费观看 | 色综合久久中文色婷婷 | 俄罗斯17vidio | 蜜柚免费视频高清观看在线 | 日韩欧美群交P内射捆绑 | 精品夜夜澡人妻无码AV蜜桃 | 午夜亚洲WWW湿好爽 午夜亚洲WWW湿好大 | 久久er国产免费精品 |

電子發燒友

中國電子工程師最喜歡的網站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術信息
  • 參加活動獲取豐厚的禮品