1

我正在从串行 GPS 中检索 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 语句不能捕获?是美元吗?我该如何解决这个问题?

4

3 回答 3

2

自从我阅读 NMEA GPS 以来已经有一段时间了...

您不需要比较与 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 Data、GPRMC 句子之外的句子,并且您需要重新阅读直到获得正确的句子?另外,您确定您的 GPS 的数据类型为 as$GPRMC而不是GPRMC?我认为数据类型中不应该有 a $

即,在伪:

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)

要调试循环,请尝试对元素进行控制台写入:

string[] Words = sBuffer.Split(',');
        foreach (string item in Words)
        {
            Console.WriteLine(item);
        }
于 2010-04-18T19:38:30.330 回答
1

你在计算校验和吗,我没看到。

NMEA 维基

于 2010-04-18T19:39:10.737 回答
0

编辑:正如评论员 mtrw 所说,我在下面的回答是没有改进,==字符串类重载了。我错了。

在我看来,您的if-Statement 是错误的。使用==运算符,您正在检查它是否是相同的引用(当然不会是这种情况)。要简单地比较两个字符串是否包含相同的值,请使用String.Equals().

于 2010-05-26T08:31:54.117 回答