2010-04-18 2 views
1

직렬 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 문이 catch되지 않습니까? $가 맞습니까? 어떻게 문제를 해결할 수 있습니까? 내가 NMEA GPS를 읽기 때문에

+0

원본 문자열을 sBuffer 변수에 정확히 입력 했습니까? 쉼표 앞에 공백이있을 수 있습니까? 또는 다른 사소한 불일치? 또한 foreach 문에서 중단 점을 설정하십시오. 때 맞추기, sBuffer와 단어를 모두 디버거 시계에 추가하고 단어를 확장 한 다음 그 스크린 샷을 찍어 여기에 게시하십시오. –

+0

오, 덧붙여서 잊어 버렸습니다 : 아니오, 달러 기호는 아무 상관이 없습니다. –

+0

인쇄 금지 문자가 없는지 확인하십시오 (예 : 이전 줄에서 읽은 CR에서 남겨진 길잃은 LF 문자. –

답변

2

그것은 당신이 NMEA 데이터 형식이 아닌 전체 NMEA 버퍼 요소에 해당하는 문자열을 비교할 필요가 없습니다 ... 잠시

을하고있다? .Split 메서드는 sBuffer를 NMEA 문장의 모든 쉼표로 분리하여 각 개별 요소를 갖도록합니다. 그런 다음 루프의 첫 번째 요소에 대해 하위 문자열을 테스트하여 모든 요소를 ​​살펴보고자 함을 의미합니다. NMEA 스트림이 최소 데이터, GPRMC 문장 이외의 문장을 출력 될 가능성이있다

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

당신은 때까지 다시 읽도록해야합니다 혼란 ...

그래서 테스트는 잘 보이지 않을 것이다 너는 정확한 문장을 가지고 있니? 또한 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); 
     } 
1

당신이 체크섬을 계산할을, 나는 그것을 볼 수 없습니다.

NMEA Wiki

0

편집 : 내 대답은 아래 해설자의 mtrw 명시된대로 ==은 문자열 클래스에 의해 오버로드, 더 개선 없습니다. 내가 틀렸어.

내 생각에 if - 내용이 잘못되었습니다. == 연산자를 사용하여 동일한 참조인지 확인합니다 (실제로는 그렇지 않습니다). 두 문자열에 동일한 값이 포함되어 있는지 비교하려면 String.Equals()을 사용하십시오.

+0

.NET 문자열 클래스가 ==를 오버로드하여 '같음'을 호출합니다. http://www.yoda.arachsys.com/csharp/strings을 참조하십시오.html – mtrw

+0

좋아, 나는 그것을 추측하고 있었다. 확인하지 않았다. 감사합니다 mtrw! 그럼 드류크의 대답은 괜찮아. 답변으로 표시해야합니다. 게시물도 수정했습니다. – rdoubleui

관련 문제