0

関数を自分の目的に合わせてより適切に変更しようとしています。

int getc0 (void)
{
    while ( (U0LSR & 0x01) == 0 ); //Wait for character
    return U0RBR;
}

上記のコードは、シリアル ポート 0 で文字が受信されるまで関数をハングさせ、それを返します。そのようにwhileループを使用して呼び出していました。

while((str = getc0())!='\r'){
    strcat(&route_buffer,&str);
}

そのため、シリアルポートを介してリターンキャリッジが受信されるまで待機し、これがバッファにコピーされる前の各文字が表示されます。今、私の問題です。現在、データの読み取りに問題があり、どこに問題があるのか​​ を判断できません.どちらの方法でも、改行または改行が正しく認識されていませんが、一部の出力で検出されています! 完了したらすべてをファイルに保存しているので、これはわかっていますが、これを行うには、 while ループで ai!=5 を使用し、5 文字を読み取るだけです。20にすると、再びハングし、他に何も読み取っていないように見えます(uart経由でデータを送信しているにもかかわらず)

X時間読み取り、残りの機能を続行するように変更する方法はありますか?

編集:

char route_data[512], route_buffer[200];

編集2:

char *str;

わかりました、これはユーザー入力を読み取るために私が書いた関数です。

char* readInput(void){

    userinput = 0;
    str = 0;

    while((str=getc0())!='\r'){
        strcat(&userinput,&str);

    }
    return &userinput;

}

そしてそれはそのように呼ばれます。

strcat(config.nodeid,readInput());

よく呼ばれますが、これは私の呼び方の一例です。次に、これをファイルに出力すると、100% の確率で動作します。

問題全体を説明するのにおそらく役立つでしょう。シリアル ポート (RX および TX) にワイヤレス モジュールが接続された ARM ボードがあります。上記の readInput 関数は、ワイヤレス モジュールに telnet 接続したユーザーからの入力を読み取るために使用され、ARM ボードがユーザーからのすべての入力を読み取れるようにします。私が今達成しようとしているのは、コマンドを実行した後にワイヤレスモジュールからの入力を読み取ることです。printf ステートメントを使用すると、コマンドをステートメントに入れることでコマンドを実行できます。私が達成する必要があるのは、ワイヤレス モジュールからの出力を読み取ることです。ここで問題が発生します。私はいくつかの出力を取得していますが、それは非常に限られており、期待したものではありませんが、明らかにモジュールからのものです。

4

1 に答える 1

3

str は nul で終了する文字列ではありません。そのアドレスを strcat() に渡すと、不定量のデータが route_buffer に連結されます。

strcat() を使用することは、多くの理由からどのような場合でも悪い考えであり、あなたの使用は特にお勧めできません。バッファ オーバーランに対する保護はなく、strcat() は呼び出されるたびに route_buffer 内の文字列の長さを不必要に再決定する必要があります。

わずかに良い解決策は次のとおりです。

int index = strlen(route_buffer) ;
int ch ;
while( index < sizeof(route_buffer) - 1 && (ch = getc0()) != '\r')
{
    route_buffer[index] = ch ;
    index++ ;
}
route_buffer[index] = 0 ;

route_buffer は実際にはヌルで終了する文字列であるなど、元のコードからいくつかの仮定を立てました。これらは設計上の決定事項です。それらは正しいか、または良いものである場合とそうでない場合があります。

問題のより良い解決策は、受信した文字を UART Rx 割り込みハンドラーからリング バッファーに入れ、読み取り関数にバッファーから非同期的にデータを取得させることです。その後、必要に応じて、ブロッキング、ボーキング、およびタイムアウト アクセスを簡単に実装できます。ISR にバッファリングされた改行数をカウントさせることもできるので、バッファ内で利用可能な行数を事前に知ることができます。また、バッファリングにより、文字のオーバーランやデータの損失を防ぐために、コードが UART の処理に間に合うかどうかを心配する必要がなくなります。

タイムアウト動作が必要な場合は、getc0() の while ループと行入力ループの両方で、いくつかのタイマー ソースを追加でテストする必要があります。

于 2011-03-10T21:14:27.917 に答える