在c#中创建并保持流存活

时间:2011-01-07 00:31:21

标签: c# stream serial-port nmea

我正在使用漂亮漂亮的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重定向。

感谢。

1 个答案:

答案 0 :(得分:2)

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

您可以look here获得有关如何复制流的良好解决方案。