娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月10日(星期二)

2018年06月10日 | Keil重定向printf到串口UART輸出

發布者:古通閑人 來源: eefocus關鍵字:Keil  重定向printf  串口  UART輸出 手機看文章 掃描二維碼
隨時隨地手機看文章

下面是我搜索到的可以借鑒的討論+我的評述

評述:在一個芯片系統里,uart的驅動是廠商自己寫好的,那他們是怎么關聯printf到uart的呢?有人說,printf最終是調用了putchar,我搜索了源碼,沒有這個函數,估計是開發工具,像KeilC u3,里面已經集成了putchar。于是我奇怪,這個工具怎么知道廠商哪個函數時uart的,有沒有命名規則要求?好像沒有,看了下面的討論,估計是通過UART的收發寄存器來關聯的。我猜想應該是在某個地方,keilc關聯了系統的寄存器列表,找到了串口的寄存器的地址,然后putchar操作該寄存器,就相當于操作了廠商或者開發者自定義的uart_write_byte.uart_read_byte.

所以在keilc里,別人寫好的系統,可以直接調用printf輸出。我覺得要弄明白,得研究下keil是怎么處理庫函數和寄存器的關系的。


關于putchar函數,估計printf是通過

http://www.amobbs.com/thread-5479867-1-1.html


就是在你配置完串口的時候首先寫一個數到SBUF寄存器中然后在用printf函數打印就可以,當讓這個順序是不可以變的,如果你想在追問細節為什么,我只能告訴你這應該是開發環境決定的,這一點我就理解這么多,如果有大俠給出更好的解釋我也一起共勉。


其實也不用首先寫一個數據到SBUF寄存器,只需在串口初始化后,加上一句TI=1;即可。原因是printf函數事實上是調用putchar輸出字符的。之所以能輸出到串口上,就是因為putchar函數把字符通過串口輸出。
這是keil中putchar最簡單的版本,其他版本也一樣,看函數就明白為什么要先讓TI=1;了,樓主寫的那個SBUF=0,原理是相同的,寫入了數據,那么TI就等于1了,然后就可以使用putchar函數和printf函數了。
putchar函數的源碼在{keil安裝目錄下}\C51\LIB文件夾里的PUTCHAR.C文件里,另外在keil的幫助文檔里有說明

char putchar (char c)  {

  while (!TI);

  TI = 0;

  return (SBUF = c);

}

從下面這篇文章中,我好像找到答案了

評述:我在某個CortextM3的源碼里的debug.c找到了fputc。應該說,某些系統是通過fputc建立聯系,而不是putchar的。如下:


void fputc_hook(char ch)  

{  

    if (DebugType == 0)  

    {  

        UARTWriteByte(ch, 1000);  

    }  

    else  

    {  

        VirtualUartWrite(ch);  

    }  

}  

  

int fputc(int ch, FILE *f)  

{  

    uint8 dgbBuffer[DEBUG_TIME_LEN];  

    uint32 tmpcnt, i;  

  

    if (ch == '\n')  

    {          

        tmpcnt = SysTickCounter;  

        for (i = 0; i < DEBUG_TIME_LEN; i++)  

        {  

            dgbBuffer[i] = tmpcnt % 10;  

            tmpcnt = tmpcnt / 10;  

        }  

          

        fputc_hook('\r');  

        fputc_hook('\n');  

        fputc_hook('[');  

        for (i = 0; i < DEBUG_TIME_LEN; i++)  

        {  

            fputc_hook(dgbBuffer[DEBUG_TIME_LEN - 1 -i]+0x30);  

            if (DEBUG_TIME_LEN - 1 -i == 2)  

            {  

                fputc_hook('.');  

            }  

        }  

        fputc_hook(']');  

          

        return OK;  

    }  

      

    fputc_hook(ch);  

  

    return OK;  

}  

下面是參考文章的轉載:
http://blog.chinaunix.net/uid-27631233-id-3345008.html


    在實際工作中,遇到了這么一個問題,需要向不同的串口傳輸ASCII碼,無疑使用printf函數是最方便的。然而printf打印出的信息無法選擇出口。在網上搜到的程序,printf要調用fputc函數發送字符。該函數如下:


int fputc(int ch, FILE *f)
{
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}

    入口參數有字符和字符要輸出到的文件指針。根據搜索,printf函數輸出到stdout,而fprintf可以指定字符到達的文件??蒄ILE結構體中,沒有一個是與串口相關的。

typedef struct {
  char *fpos; /* Current position of file pointer (absolute address) */
  void *base; /* Pointer to the base of the file */
  unsigned short handle; /* File handle */
  short flags; /* Flags (see FileFlags) */
  short unget; /* 1-byte buffer for ungetc (b15=1 if non-empty) */
  unsigned long alloc; /* Number of currently allocated bytes for the file */
  unsigned short buffincrement; /* Number of bytes allocated at once */
} FILE;

    該如何重定向呢?不知道。但有一個彌補的方法。
    自己定義n個FILE*指針,并任意賦值。在fputc中利用if..else來做判斷,代碼如下:

FILE* FileUart1 = (FILE*)0x19;
FILE* FileUart2 = (FILE*)0x28;
int fputc(int ch, FILE *f) {
  if ( f == FileUart1 ) {
    USART_SendData(COM_USART[0], (uint8_t) ch);
    while (USART_GetFlagStatus(COM_USART[0], USART_FLAG_TC) == RESET){}
  }
  else if ( f == FileUart2 ) {
    USART_SendData(COM_USART[1], (uint8_t) ch);
    while (USART_GetFlagStatus(COM_USART[1], USART_FLAG_TC) == RESET){}
  }
}

    這樣,fprintf(FileUart1,...)和fprintf(FileUart2,...)便能向不同的串口發送數據。哈哈,雖然沒有真正做到重定向,只是用了個歪招,但最初的目的還是達到了。


關鍵字:Keil  重定向printf  串口  UART輸出 引用地址:Keil重定向printf到串口UART輸出

上一篇:STM32F103程序串口調用printf打印數據
下一篇:STM32串口打印printf發送中文亂碼問題

推薦閱讀

爬樓梯快遞派送機器人相信很多人都有這樣郁悶的經歷,由于樓層低、沒電梯,快遞員打電話讓客戶自己下樓取件。為了解決這個問題,一群來自杭州電子科技大學的學霸近日研發出了一款“爬樓梯快遞派送機器人”。“爬樓梯快遞派送機器人”可以先給快遞買家發短信,得到“在家”確認后告知對方多長時間到,然后出發送件,它可以在樓宇間穿行,進入樓層,遇到樓梯...
據報道,韓國國防部日前宣布將研發軍用仿生機器人,以提升防御與偵察能力,增強武裝部隊的戰斗力水平。預計這類仿生機器人將于2024年進入到韓國軍隊服役。 那么,這些軍用仿生機器人將承擔哪些作戰任務?會給未來戰爭形態帶來哪些改變?就相關話題,軍事觀察員李莉將為您做深入解析。 圖:韓國先進科技學院設計出模仿迅猛龍的機器人原型 軍事觀察員李...
6月5日,TCL華星與三安半導體在深圳正式簽約,宣布共同投資成立具有獨立法人資格的聯合實驗室。注冊資本人民幣3億元,TCL華星出資占注冊資本的55%,三安半導體出資占注冊資本的45%。在今年3月3日,華星光電與三安半導體簽訂戰略合作備忘錄。據當時TCL動態微信消息,根據戰略合作協議,雙方將共同成立聯合實驗室,開展 Micro-LED顯示技術端到端開發,重點...
中國新能源汽車市場在經歷了探索的“萌芽期”、百花齊放的“膨脹期”和格局重塑的“低谷期”,如今迎來了蓬勃向上的“加速期”,并開始換擋提速。 在6月5日“2021新能源汽車產業發展金壇長蕩湖峰會”上,蜂巢能源董事長、CEO楊紅新發表“新形勢下動力電池企業的機遇與挑戰”的主題演講。 楊紅新的判斷是,得益于政策端、需求端、供給端、成本端等多重因素...

史海拾趣

問答坊 | AI 解惑

古董級的電子管收音機圖紙

古董級的電子管收音機圖紙,有需要的朋友嗎? [ 本帖最后由 西門 于 2009-5-13 19:18 編輯 ]…

查看全部問答∨

臺灣RF大牛Shuenn-Yuh Lee課件Radio Frequency Integrated Circuits

1Radio Frequency Integrated Circuits Instructor : Shuenn-Yuh Lee National Chung Cheng University Department of Electrical Engineering Office : 431 TEL : (05)2720411-33223, BP : 0921565137 E-mail : sylee@vlsi.ee.ccu.edu.t ...…

查看全部問答∨

WaitForMultipleObjects用得對么??

我創建了一個key_Interrupt_event[10]中斷事件組,分別用KernelIoControl與InterruptInitialize函數與對應的外部中斷注冊上了。 然后用一個WaitForMultipleObjects等待任何一個中斷的發生,然后執行響應動作。如下: while(1){ IntrEventNum = W ...…

查看全部問答∨

ioctl非阻塞

如何設置能使得調用ioctl在一段時間沒有返回的時候自動退出?即非阻塞模式,謝謝。…

查看全部問答∨

關于ads1115

關于ads1115 求大俠指導 請問關于ads1115的基準電壓怎么選擇 它不是內部基準嘛 想知道怎么選 最好給點程序 就有關基準就行…

查看全部問答∨

求幫助ISE使用

最近剛開始學習FPGA,下了個ISE12.3,打開一個別人的程序,說是程序版本過低,需要更新,利用xilinx paltform studio打開xmp有很多更新,一步步下去后報錯,說要手動加載什么東西,錯誤是: IPNAME:clock_generator INSTANCE: clock_generator_0 - ...…

查看全部問答∨

只有兩個0--30v電源,想用7905和7805得到正負5v電源可以嗎

本帖最后由 paulhyde 于 2014-9-15 03:31 編輯 我把-15v電源輸入到7905(這-15v的電源是從我的0至正30v可調電源得到的,我把可調電源輸出的正極接到7905的一管腳(地),可調電源的負極接到7905的輸入管腳),這樣是不是就相當于給7905輸入的是-15 ...…

查看全部問答∨

【TI首屆低功耗設計大賽】+ 移植grlib例程,將夏普屏點亮

本帖最后由 wgsxsm 于 2014-9-20 23:04 編輯 拿到板子也有數日了,由于對MSP430 mcu使用不多,不是很熟悉,再加上因為工作比較忙,一直未動手。周末才有空閑下來開始探索金剛狼開發板。 前一段無意間看到提交創意申請開發板,去官網看了一下對這 ...…

查看全部問答∨

Open1081-UserManualV中“使用JLINK下載BOOT” 勘誤

在其中的4.1節中的第四部分中的Address有誤。 應該把Address改為08000000. …

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 黄骅市| 策勒县| 台东县| 鲁山县| 桃园县| 逊克县| 嵩明县| 梨树县| 紫云| 马山县| 盱眙县| 龙山县| 新疆| 乌鲁木齐市| 商水县| 黔西| 柳州市| 新干县| 稷山县| 民和| 揭东县| 荣成市| 丰镇市| 武功县| 抚远县| 碌曲县| 四平市| 施秉县| 岱山县| 淳化县| 介休市| 攀枝花市| 曲麻莱县| 潼南县| 凉城县| 浏阳市| 南开区| 衡东县| 腾冲县| 青田县| 保靖县|