从串行端口解析NMEA数据时遇到问题

从串行端口解析NMEA数据时遇到问题

问题描述:

我正在从串行GPS获取NMEA语句。然后字符串像我期望的那样出现。问题是,分析这样的句子时:从串行端口解析NMEA数据时遇到问题

$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A 

我用一个简单的代码位,以确保我有权利sentect:

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

我增加了对在该位置返回例。我已将分割结果打印到文本框中,并且已经看到$ GPRMC确实在某个点处出现在项目变量中。如果字符串遇到为什么if语句不会被捕获?是$?我该如何解决这个问题?

+0

您确定您提供的源字符串与您的sBuffer变量一样吗?难道在逗号前有空格吗?还是其他一些小的不一致?另外,尝试在foreach语句中设置一个断点。当它命中时,将sBuffer和Words添加到调试器手表中,然后展开Words,然后截取并在此处发布。 – 2010-04-18 18:58:22

+0

哦,忘了补充:不,美元符号与它无关。 – 2010-04-18 18:59:12

+0

确保那里没有任何非打印控制字符,例如从前一行读到CR的剩余LF字符。 – 2010-04-18 19:50:41

它已经有一段时间,因为我读的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数据流输出比极小数据,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) 

要调试循环,尝试元素的控制台写:

string[] Words = sBuffer.Split(','); 
     foreach (string item in Words) 
     { 
      Console.WriteLine(item); 
     } 

你是否计算校验和,我没有看到它。

NMEA Wiki

编辑:我的回答下面没有起色,作为评论员mtrw说明,==由string类重载。我错了。

我的想法你的if-声明有问题。使用==运算符,您正在检查它是否是相同的引用(当然不是这种情况)。要简单比较两个字符串是否包含相同的值,请使用String.Equals()

+0

.NET字符串类重载==来调用“Equals”。见http://www.yoda.arachsys.com/csharp/strings。html – mtrw 2010-05-26 08:36:40

+0

好的,我假设,没有检查它。谢谢mtrw!然后drewk的答案就好了。应标注回答。编辑帖子也是如此。 – rdoubleui 2010-05-26 09:49:18