1

私はかなり気の利いた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リダイレクトを修正できます。

ありがとう。

4

1 に答える 1

2

2 つのストリームを作成しようとします。シリアル ストリームから手動で読み取り、両方のストリームにコピーします。それらの 1 つを使用するように nmeaParser を設定し、2 番目のものから IP ハンドラーを読み取らせます。

ストリームをコピーする方法については、こちらを参照してください。

于 2011-01-07T00:43:43.453 に答える