2016-10-01 5 views
0

printf機能を使用して、シリアルポートの文字を印刷します。私はこれらの2つのポスト12を読みました、しかし、マニピュレータを理解するI'amはわからない:printfをシリアルポートに再設定

言われています1st linkに:

をprintfの機能を有効にするには、まずあなたが新しい__FILE構造体を作成する必要があります。この構造体はFILE構造体で呼び出されます。

なぜ私は__FILE構造体を作成しなければならないのですか?私はこの文章を本当に理解していませんでした。 2nd link

我々はまた、__stdout__stdinを再定義しなければならなかった標準I/Oライブラリーからの分離を完了するために

を言われています。これらは、__FILE構造体の宣言の下のretarget.cファイル内にあります。

これらの2つの変数を再定義すると、それはコンパイルエラーではなく、私は再定義を意味します。

+0

を。あなたは 'dup2()'を持っていますか?あなたのプラットフォームは 'stdout'に対してファイル記述子' 1'を使っているLinuxのように、通常の 'stdout'ファイル記述子の値を持っていますか?もしそうなら、 'int fd = open("/path/to/port "...);のようなことをしてください。 dup2(fd、STDOUT_FILENO); '。 'stdout'バッファリングを無効にしたいかもしれません。 –

+0

多分、freopenはあなたの役に立つかもしれません。 – JohnTortugo

+0

フィードバックのおかげで、@アンドリューヘンレ私はundfstand 'printf'は、' printf'関数のどこかにscreenにcaracterを表示するために 'fputc'を使用します。これは' fputc(stdout、car) 'への呼び出しです。もし我々がstdout fdを重複しているとすれば、 'car'も新しいfd(dupによって作成された)にprintdされますが、どうなりますか? – Mouin

答えて

1

これはおそらくHow to make printf work on STM32F103?

の重複は、私はとにかく、ここにも、私は上記のスレッドに投稿私の答えを、置くことがあります。

独自のprintf実装を書くことはオプションであり、おそらく私の推奨するオプションです。標準的なライブラリの実装からインスピレーションを得て、自分のバージョンを書くだけで、あなたの要件を満たすことができます。一般に、あなたがしなければならないことは、最初にシリアルインタフェースを通してcharを送るputc関数をretargetすることです。次に、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/

関連する問題