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

我会尝试创建两个流。手动从串行流中读取,并复制到两个流中。将 nmeaParser 设置为使用其中之一,并让 IP 处理程序从第二个读取。

您可以在此处查找有关如何复制流的良好解决方案。

于 2011-01-07T00:43:43.453 回答