2016-10-01 24 views
0

我想使用函數printf在串口上打印字符。我已閱讀這2個職位12,但我'不知道理解MANIP:將printf重定向到串口

1st link有人說:

要啓用printf的功能,首先你需要創建一個新的__FILE結構。這個結構然後用FILE結構體調用。

爲什麼我必須創建__FILE結構體我並沒有真正解決這個問題。

2nd link有人說

完成從我們也不得不重新定義__stdout__stdin標準I/O庫的分離。這些可以在__FILE結構的聲明下面的retarget.c文件中找到。

如果我重新定義這兩個變量不是一個編譯錯誤,我的意思是重新定義。

+0

這肯定似乎是艱難地做到這一點。你有'dup2()'?你的平臺是否有一個「正常」的'stdout'文件描述符值,比如''stdout''使用文件描述符'1'?如果是這樣,只要做一些像'int fd = open(「/ path/to/port」...); dup2(fd,STDOUT_FILENO);'。你可能想禁用'stdout'緩衝。 –

+0

也許freopen可能對你有用。 – JohnTortugo

+0

感謝您的反饋,@Andrew Henle作爲我undrestand'printf'將使用'fputc'在scrreen上顯示caracter,因此'printf'函數中的某處會調用'fputc(stdout,car)',所以在此如果我們重複了stdout fd,那麼'car'也會被打印到新的fd中(由dup創建),但是會發生什麼? – Mouin

回答

1

這可能的How to make printf work on STM32F103?

一個重複我會把我的回答,我貼在上面的線程,這裏也,反正。

寫一個自己的printf實現是一個選項,可能是我最推薦的選項。從標準庫實現中獲得一些靈感,並編寫自己的版本,以滿足您的需求。一般來說,你必須做的是,首先重新定位一個putc函數,通過你的串行接口發送字符。然後使用putc自定義實現覆蓋printf方法。也許,一個非常簡單的方法是通過遞歸調用putc函數來以字符方式發送字符串。

最後但並非最不重要的,你可以找到一些輕量級的printf實現。這些輕量級實現提供的代碼大小和功能集位於自定義書寫printf函數和庫存標準prinf函數(也就是野獸)之間。我最近嘗試過這一點,並對其內核佔用空間和所需執行週期數在ARM內核上的性能感到非常滿意。 http://www.sparetimelabs.com/tinyprintf/tinyprintf.php

-PS

從我自己的著作複製某個備份 - http://mycola.info/2015/02/09/lightweight-printfscanf-for-embedded-applications/