2

次のコード スニペットを使用して、1 秒に 1 回、COM ポートを介して GPS データを送信しています。

serialPort = new SerialPort("COM4", 4800, Parity.None, 8, StopBits.One);
serialPort.Handshake = Handshake.None;
serialPort.WriteTimeout = 500;
serialPort.Open();

これはすべて問題ありませんが、次の方法を使用してシリアルポートに書き込む場合:

serialPort.Write(theString);

以下をtheString == 504 charactors使用して、私の読み取りプログラムで:

  while (true) {
      Console.Write(serialPort.ReadExisting());
  }

254 bytesその書き込みステートメントからデータを読み取るだけです。パテでも同じことが起こります。

書き込みステートメントをバイト サイズのチャンクに分割して 2 回書き込みを試みまし254たが、2 回目の書き込み操作は、ライター プログラムで実行されていることが確認されていますが、リーダー プログラムでは読み取られないようです。

4096 bytes書き込みバッファがで、読み取りバッファが であることはわかっています2048 bytes

私の文字列はこれです:

$GPGGA,191500.00,3351.6474,S,15112.6510,E,2,04,2.5,+0008,M,+020,M,00,0000*76
$GPVTG,057.3,T,,,000.0,N,000.0,K,A*41
$GPRMC,191500.00,A,3351.6474,S,15112.6510,E,000.0,057.3,120412,D*40
$GPGLL,3351.6474,S,15112.6510,E,191500.00,A,A*79
$GPGSA,A,3,,,,,,,,,,,,,2.5,1.3,2.1*34
$GPGSV,1,1,5,03,20,40,89,06,18,30,86,12,25,15,80,20,5,36,70*77
$GPDTM,999,,0.0,S,0.0,E,+0.0,W84*3B
$GPZDA,191500.00,11,04,12*60
$GPGBS,191500.00,+020.0,+020.0,+000.0,,0.00000,+0000.0,0000.0*63
$GPMSS,999,999,200.0,4800,*56

文字列の行ごとに 1 つの書き込みステートメントを使用してバッファーに書き込もうとすると、すべてがバッファーに書き込まれますが、2 つの書き込み操作がリーダーでインターレースされるため、結果は次のようになります。

etc...
$GPGGA,191500.00,3351.6474,S,15112.6510,E,2,04,2.5,+0008,M,+020,M,00,0000*76
$GPDTM,999,,0.0,S,0.0,E,+0.0,W84*3B
$GPVTG,057.3,T,,,000.0,N,000.0,K,A*41
$GPZDA,191500.00,11,04,12*60
$GPRMC,191500.00,A,3351.6474,S,15112.6510,E,000.0,057.3,120412,D*40
$GPGBS,191500.00,+020.0,+020.0,+000.0,,0.00000,+0000.0,0000.0*63
$GPGLL,3351.6474,S,15112.6510,E,191500.00,A,A*79
$GPMSS,999,999,200.0,4800,*56
$GPGSA,A,3,,,,,,,,,,,,,2.5,1.3,2.1*34
$GPGSV,1,1,5,03,20,40,89,06,18,30,86,12,25,15,80,20,5,36,70*77
etc...

これは私には意味がありません.9600ボーレートではインターレースの問題は発生しませんが(私は4800 baud == 480bytes/s. .

質問:

ストリームに 504 バイトのデータを書き込んでいるときに、読み取りが 254 バイトのデータしか取得しない理由を知っている人はいますか? 何か制約はありますか

serialPort.Write(Byte[], int offset, int count);

254 バイトを超えることはできませんか? (これは、2 番目の書き込み操作が完了していないことを説明するものではありません)。

あるいは。シリアルポートに書き込むより良い方法を知っている人はいますか?


この方法は、提供されたデータに対して機能するように見えます(私の元の質問はまだ残っていますが):

string Sentence = "";
for (int i = 0; i < block_list[total_block].Count; i+=2) {
    Sentence = block_list[total_block][i] + block_list[total_block][i+1];
    serialPort.Write(Sentence);
}
4

1 に答える 1

2

ちょっと待ってください。1 秒のタイムアウトを使用したと述べましたが、コードは次のようになります。

serialPort.WriteTimeout = 500;

これは、送信側での 0.5 秒のタイムアウトです。そして 4.8Kbps (あなたが述べているように、これは毎秒およそ 480 文字です) では、約 240 文字を送信するのに十分な時間です。

0.5 秒のタイムアウトがないため、GPS がこれを実行できる可能性があります。

タイムアウトを少し上げてみて、何が起こるか見てみましょう - 5 秒あれば、テストのための十分な息抜きのスペースが得られるはずです。4.8Kbps では、504 バイトを完全に送信するには 1 秒強かかります。

そして、あなたが本当にハンドシェークを望んでいないことを確認してください。それがないと、途中でデータが失われる可能性もあります。

于 2012-04-12T03:21:51.267 に答える