2017-06-13 3 views
0

私はARM(SAM4)を使用していますが、2つのUARTがあり、fprintfを使用して両方で印刷できるようにストリームを設定する必要があります。fprintfで使用するUARTから複数のストリームを定義する方法

はすでに運なしfwopenを試してみました:

FILE * debug; 

debug_writefn(void *cookie, const char *buf, int n); 

void comm_init(void) { 
    debug = fwopen(NULL, &debug_writefn); 
    if (debug == NULL) { 
    printf("Error"); 
    } 
    fprintf(debug, "Test"); 
} 

しかし、debug_writefnは新しいと呼ばれています。

私はarm-none-eabi-*ツールチェーン(newlibを使用していると思います)、ASF、FreeRTOSを使用しています。

あなたが唯一例えば、標準出力に必要な任意の方法でストリームファイルハンドルを処理するために再実装のnewlibの _write()または write_r()システムコールする必要が
+1

この質問は、より密接にあなたのコンパイラとの細目に関連していますMCUやハードウェアよりも標準的なライブラリを実装しているので、作業しているものを手助けすることができます。おそらく、完全な例(例えば 'fwopen'のエラーリターンをチェックしたかどうか)とともに。私は 'snprintf 'を経由して中間バッファに書き込む代わりに、UARTに_that_を転送するという簡単でポータブルな回避策をとることはできないと思いますか? – doynax

+1

どのツールチェーンですか?どのような実行環境(OS、ベアメタル)?一般的に、ベアメタルシステムでは、ライブラリのターゲットを変更する必要があります。そこでは、データをstdoutまたはstderrストリームに両方のポートに送信するだけです。 – Clifford

+0

あなたがベアメタルである可能性が高い場合(RTOSを使用している場合)、ベアメタルではないと感じるように、非常に大きなコードをここに追加するように求めています。文字列を出力したいだけなら、非常に大きなCライブラリコードを必要とせず、バイトをUARTに送るだけで済みます。 –

答えて

1

enum 
{ 
    STDIN_HANDLE, 
    STDOUT_HANDLE, 
    STDERR_HANDLE 
} ; 

long _write(int fd, const void *buf, size_t cnt) 
{ 
    int ret = EOF ; 

    if(fd == STDOUT_HANDLE || fd == STDERR_HANDLE) 
    { 
     for(int i = 0l i < cnt; i++) 
     { 
      serialPutc(UART1, buf[i]) ; 
      serialPutc(UART2, buf[i]) ; 
     } 

     ret = i ; 
    } 

    return ret ; 
} 
関連する問題