私はかなり気の利いたnmeasharpプロジェクトを使用して、c#のシリアルポートで受信しているNMEAストリームを解読しています。箱から出してすぐにすべて正常に動作しますが、データをIPアドレスにミラーリングしたいので、行き詰まります。
nmeasharpパッケージは任意のストリームからデータを取得するため、以前はシリアルポートストリームに接続していましたが、これは正常に機能しました。
_nmeaParser.Source = serialport.BaseStream;
ここで、シリアルポートイベントを使用して、データをリダイレクトできる独自のルーチンをトリガーしたいので、上記の割り当てを削除して、次のように設定します。
_serialport.DataReceived += new serialDataReceivedEventHandler(HandleNewSerialPortData);
このイベントがトリガーされ、メソッドが呼び出されます。この時点ではすべて問題ありませんが、nmeasharpコードは、ストリームに割り当てていないため、リッスンするストリームを探しています。
次の方法では、nmeasharpへのストリームを設定し、シリアルポートが受信したばかりの新しいデータをそのストリームに書き込む必要があります。
private void HandleNewSerialPortData(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
this.serialDataAvailable(indata); // raise event that writes string to IP
if (_nmeaParser.Source == null) _nmeaParser.Source = new MemoryStream(840);
if (_nmeaParser.Source.CanWrite) _nmeaParser.Source.Write(ASCIIEncoding.UTF8.GetBytes(indata), 0, indata.Length);
// Unsuccessful attempts
// MemoryStream s = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(indata));
// s.CopyTo(_nmeaParser.Source);
// sp.BaseStream.CopyTo(this.NmeaDataStreamFromSerialPort);
}
nmeasharpストリームへの書き込みを試みるいくつかのバリエーションを試しましたが、どれも機能しません。約束を示したのは、毎回新しいストリームを初期化することでしたが、それは、すべてのDataReceived
イベントの後にストリームが閉じられ、シリアルメッセージが切り捨てられて失われることを意味しました。(失敗した)コードは次のとおりです。
_nmeaParser.Source = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(indata));
私はたくさんのチュートリアルを読み、見つけたすべてのmsdnドキュメントを読みましたが、それでもこの単純なことを機能させることはできません。これは簡単なことですよね...?
編集:可能であればnmeasharpコードストックを保持したいと思います。これは正常に機能し、シリアルデータは常にASCIIであるとは限らないため、データを文字列として送信するのではなく、バイナリ(ストリーム)のままにしておきたいと考えています。後でバイナリのIPリダイレクトを修正できます。
ありがとう。