3

こんにちは私はRead()メソッドを使用して、シリアルポートから0123456789などの10文字を読み取ります。実際には、文字はPICマイクロコントローラーによって送信されます。

これが私のコードです:

serialPort1.PortName = "com4";
serialPort1.BaudRate = 9600;
serialPort1.Open();
char[] result = new char[10];
serialPort1.Read(result, 0, result.Length);
string s = new string(result);
MessageBox.Show(s);
serialPort1.Close();

コードを実行すると、メッセージボックスが表示され、最初の文字のみが表示されます。メッセージボックスには「0」のみが表示されます。

どこが間違っているの?

4

1 に答える 1

5

あなたが間違っているのは、Read() の戻り値に注意を払っていないことです。これは、読み取られたバイト数を示します。

シリアル ポートは非​​常に低速なデバイスであり、通常のボーレート設定 9600 では、1 バイトの転送に 1 ミリ秒かかります。これは、最新のプロセッサにとっては膨大な時間であり、1 ミリ秒で数百万の命令を簡単に実行できます。Read() メソッドは、いくつかのバイトが利用可能になるとすぐに戻ります。ドライバーがそれらすべてを受信するのに十分な時間を確保できるように、プログラムを人為的に遅くした場合、10 個すべてを取得するだけです。

簡単な修正は、それらをすべて取得するまで Read() を呼び出し続けることです。

char[] result = new char[10];
for (int len = 0; len < result.Length; ) {
   len += serialPort1.Read(result, len, result.Length - len);
}

別の一般的な解決策は、データの終わりを示す一意の文字を送信することです。そのためには、改行 ('\n') が非常に適しています。今ではもっと簡単になります:

string result = serialPort.ReadLine();

これは、任意の応答長もサポートするようになりました。データに改行が含まれていないことを確認してください。

于 2013-03-21T20:14:32.947 に答える