【发布时间】: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