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