C# 从串行端口解析NMEA数据时出错

C# 从串行端口解析NMEA数据时出错,c#,serial-port,gps,parsing,nmea,C#,Serial Port,Gps,Parsing,Nmea,我正在从一个连续的全球定位系统中检索NMEA句子。然后绳子就会像我预料的那样出现。问题是,当解析这样的句子时: $GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A 我使用一段简单的代码来确保我有正确的句子: string[] Words = sBuffer.Split(','); foreach (string item in Words) { if

我正在从一个连续的全球定位系统中检索NMEA句子。然后绳子就会像我预料的那样出现。问题是,当解析这样的句子时:

$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A
我使用一段简单的代码来确保我有正确的句子:

        string[] Words = sBuffer.Split(',');
        foreach (string item in Words)
        {
            if (item == "$GPRMC")
            {
                return "Correct Sentence";
            }
            else
            {
                return "Incorrect Sentence
            }
        }

我在该位置为示例添加了返回。我已经将分割结果打印到一个文本框中,并且看到$GPRMC确实在某个时刻出现在item变量中。如果遇到字符串,为什么If语句不能捕获?美元是多少?我怎样才能解决这个问题

我已经有一段时间没有读到NMEA全球定位系统了

您不需要比较与NMEA数据类型对应的子字符串而不是整个NMEA缓冲区元素吗?.Split方法将NMEA语句中所有逗号上的sBuffer分开,这样就有了每个单独的元素。但是接下来,您将针对循环中的第一个元素测试子字符串,这意味着您希望查看每个元素。迷惑

那么,你的测试看起来不是更好吗

string[] Words=sBuffer.Split(',');
if(String.Compare(Words[0],"$GPRMC")==0) 
            {
                return "Correct Sentence";
            }
            else
            {
                return "Incorrect Sentence
            }
NMEA流是否有可能输出Min数据、GPRMC语句以外的语句,您需要重新阅读,直到获得正确的句子?此外,您是否确定您的GPS的数据类型为
$GPRMC
,而不是
GPRMC
?我认为数据类型中不应该有
$

即,伪:

do {
  buffer=read_NMEA();  //making sure the entire sentence is read...
  array=split(buffer,",");
  data_type=buffer[0];
}
while(data_type!="GPRMC" || readcount++<=MAX_NMEA_READS)

你在计算校验和吗,我看不出来


编辑:我下面的答案是没有改进,正如评论员mtrw所说,
=
被string类重载。我错了


在我看来,您的
if
-语句是错误的。使用
==
操作符,您可以检查它是否是相同的引用(当然不是这样)。要简单地比较两个字符串是否包含相同的值,请使用
String.Equals()

是否确实提供了与sBuffer变量完全相同的源字符串?逗号前是否有空格?还是其他一些小矛盾?另外,尝试在foreach语句处设置断点。当它点击时,将sBuffer和Words都添加到调试器手表中,然后展开Words,然后截图并发布到此处。哦,忘了添加:不,美元符号与此无关。确保其中没有任何非打印控制字符,例如,读取前一行上的CR时留下的一个游离LF字符。.NET字符串类重载==以调用
等于
。好吧,我只是假设,没有检查。谢谢mtrw!那么drewk的回答就很好了。应标记为“已回答”。也编辑了这篇文章。
string[] Words = sBuffer.Split(',');
        foreach (string item in Words)
        {
            Console.WriteLine(item);
        }