.Net の SerialPort クラスをラップしてモデム操作とデータ フローを実行するラッパー クラスがあります。SerialPort オブジェクトから読み取ると、以前にポートに書き込んだデータが受信バッファー内に見つかりました。それは SerialPort オブジェクトで変更できる動作ですか? 送信データが受信バッファーに収まらないようにするクラスのプロパティが見つかりません。
SerialPort.Write() を使用してデータを書き込みます。これがデータを読み取るために行うことです
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Task.Factory.Startnew(() => WriteToBuffer());
}
// ...
private void WriteToBuffer()
{
string data = string.Empty;
lock(_serialPort)
{
StringBuilder sb = new StringBuilder();
while(_serialPort.BytesToRead > 0)
{
sb.Append(_serialPort.ReadExisting());
}
data = sb.ToString();
}
// .. then do some additional processing
}
私は偏執的になり、データ受信イベントを見逃さず、何らかのタイプのタイムアウトがあったとクライアントコードに思わせるため、ノンブロッキングの方法でデータを読み取ります。
Hayes AT コマンドを送信することで、受信バッファーにコピーされるのを防ぐことができますATE0
が、モデムがリモート モデムに接続された後に送信したデータは、受信バッファーに忍び寄っています。
何か私にできることはありますか?一度に 1 バイトずつ読み取り、返されるデータの一部であるため、バッファに最後に書き込んだ内容を確認して無視するのは困難です。たとえば、「ID 123」のようなものを送信した場合、while ループで「ID」を読み取ると、読み取るバイトが 0 バイトであることがわかり、そこで停止することがあります。毎回 Thread.Sleep() を呼び出すことができることはわかっていますが、それは良い習慣ではないと思います。
すべてのモデムでこのエコー動作を期待できますか? その場合は、コードを追加して、書き込まれたデータをフィルター処理できます。