2

これはhttp://www.gravitech.us/7segmentshield.htmlによって与えられたコードです。

void SerialMonitorPrint (byte Temperature_H, int Decimal, bool IsPositive)
{
Serial.print("The temperature is ");
if (!IsPositive)
{
  Serial.print("-");
}
Serial.print(Temperature_H, DEC);
Serial.print(".");
Serial.print(Decimal, DEC);
Serial.print(" degree C");
Serial.print("\n\n");
}

しかし、シリアルポートからデータを読み取ろうとすると、データを1文字ずつ読み取っています。

アップデート

while(1)
{
    char buffer[100];
    int chars_read = read(fd, &buffer, sizeof(buffer));
    buffer[chars_read] = '\0';
    printf("%s", buffer);
}

では、どうすれば行ごとに読み取ることができますか?

4

3 に答える 3

3

whileループは、必ずしも1文字ずつ読み取る必要はありませんが、シリアルポートデバイスと伝送速度に基づいて、読み取るたびに一度に1文字を返す場合があります。

whileループのいくつかのバグを修正するために、いくつかの変更を加えました。

while(1)
{
    char buffer[100];
    ssize_t length = read(fd, &buffer, sizeof(buffer));
    if (length == -1)
    {
        printf("Error reading from serial port\n");
        break;
    }
    else if (length == 0)
    {
        printf("No more data\n");
        break;
    }
    else
    {
        buffer[length] = '\0'
        printf("%s", buffer);
    }
}

変更点のリスト

  • からの戻り値を確認してくださいread
  • 読み取りが失敗するか0を返すと、読み取るデータがなくなり、whileループの実行が中断されると想定しています。必要に応じて、この動作を変更してください。
  • '\0'印刷する前に文字を追加してください。そうしないprintfと、バッファにガベージ値が印刷されます。

コメント:

  • 行について心配する必要はありません。読み取りは、出力時に改行として解釈される\n文字をバッファに返す必要があります。printf
  • 実際に行を取得してどこかに格納することにのみ関心がある場合は、バッファに入るまで別のバッファを読み取って追加する必要があります。また、同じバッファ内で複数の行を意味する複数\nを処理する必要があります。\n
于 2013-03-06T21:41:55.200 に答える
3

read1回の呼び出しで正確に1行のテキストが表示されることを保証することはできません。データをバッファリングする必要があります。これを行う最も簡単な方法は、一度に1文字だけを読み取り、改行文字に到達したら停止することです。毎回できるだけ多くの文字を読みたい場合は、バッファリングコードがより複雑になります。

これを開始してみてください:

char buffer[100] = {0};
int pos = 0;

while( pos < 99 ) {
    read(fd, buffer+pos, 1);           // Note you should be checking the result
    if( buffer[pos] == '\n' ) break;
    pos++;
}

// Normally you would null-terminate string, but noticed I initialised the
// buffer to all zeroes at the beginning.  So this is not strictly necessary.
// However, in this case it will remove the newline character.
buffer[pos] = 0;
于 2013-03-06T21:39:46.270 に答える
0

おそらく、それを自分で実装する必要があります。'\ n'に到達するまで文字ごとに読み続け、読んだものを返します。

私はチェックしませんでしたが、それが「readline」が通常実装されている方法だと思います。

于 2013-03-06T21:35:13.687 に答える