【问题标题】:Creating and keeping a stream alive in c#在 C# 中创建并保持流处于活动状态
【发布时间】:2011-01-07 00:31:20
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: c# stream serial-port nmea


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,好主意,但我现在不太关心复制流 - 我什至无法设置一个流作为 nmeasharp 的输入。只要我能够设置一个可以写入的持久流 - 当然,您的想法似乎很优雅。
    • 好的,所以我现在有了一个流分离器,它接收一个流并将其输出到两个(或更多)目标流。效果很好。但是,从其中一个中读取(作为内存流)是一场噩梦。我该怎么做stream.position?每次读取都将其重置为零吗?这会搞砸写作线程吗?..
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2012-01-03
    • 2014-11-16
    相关资源
    最近更新 更多