次のコード スニペットを使用して、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);
}