2017-05-05 9 views
0

GPS 데이터와 NMEA 문장을 사용합니다. 리치 텍스트 상자에 "$ GNGGA"및 "$ GNTVG"로 시작하는 문장 만보고 싶고 다른 문장 ($ GNGLL로 시작하는 문장)이 있습니다. , $ GLGSV, $ GPGSV 등). Richtextbox에 "$ GNGGA"및 "$ GNTVG"문장 만 얻으려면 어떻게해야합니까?Richtextbox에서 부적절한 문장을 삭제하는 방법은 무엇입니까?

내 코드는 다음과 같습니다. 내 질문에 대한 영업 이익의 회신 사항에 따라

 string[] gParca; 
    string gKG, gDB, gUydular, gYukseklik, gEnlem, gBoylam, gYataySapma, gKilitlenme, gVelocity, gSaat; 

     private void GPSVelocity(string NMEA2) 
    { 
     gParca = NMEA2.Split(new char[] { ',' }); 
     switch(gParca[0]) 
     { 
      case "$GNVTG": 
       gVelocity = gParca[7]; 
       break; 
     } 
     private void GPSDataBilgisi(string NMEA) 
    { 
     gParca=NMEA.Split(new char[] { ',' }); 
     switch (gParca[0]) 
     { 
      //Global Positioning System Fix data 
      case "$GNGGA": 
       gParca[2] = gParca[2].Replace('.', ','); 
       gParca[4] = gParca[4].Replace('.', ','); 
     } 
     } 
     private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     GPSDataBilgisi(serialPortGPS.ReadLine()); 
     GPSVelocity(serialPortGPS.ReadLine()); 
    } 

    private void GPSVel(string NMEA2) 
    { 
     if(checkBoxSave.Checked) 
     { 
      richTextBoxGPSData.AppendText(NMEA2); 

     } 

    } 

    private void GPSData(string NMEA) 
    { 
     if(checkBoxSave.Checked) 
     { 
      richTextBoxGPSData.AppendText(NMEA); 
     } 
    } 
+0

제 질문에 대한 답으로,'serialPortGPS'는'ReadLine()'함수가있는'TextReader' 객체처럼 작동한다고 가정 할 수 있습니까? 데이터가 이벤트 args에서 나오기를 기대하지만 코드가 다르게 생각하는 것 같습니다 ... – Flater

+0

예, serialPortGPS를 TextReader로 가정 할 수 있습니다. – Quanthema

답변

0

면책 조항
, 나는 정확히 TextReader.ReadLine() 같은 serialPortGPS.ReadLine() 작품을 가정하고있다.

입력을 필터링하려면 데이터를 검색하는 함수에 필터를 추가하십시오.

private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    for(int i = 0; i < 2; i++) 
    { 
     string line = serialPortGPS.ReadLine(); 

     if(line.StartsWith("$GNGGA")) 
      GPSDataBilgisi(line); 

     if(line.StartsWith("$GNVTG")) 
      GPSVelocity(line); 
    } 
} 

라인이 다른 것 (예를 들어, "HELLOIAMALINE")로 시작하면, 어느 쪽도 검사가 경우에 통과되지 않으며 라인과 아무것도하지 않습니다 코드, 그냥 다음 단계로 이동합니다.

당신은 그들이 더 이상 필요, 코드에서 switch 문을 제거 할 수 있습니다 (그 안에 논리를 계속 물론!)

을 난 당신의 코드와 의도는 생각 때문에 몇 가지주의가 여기에있다 조금 막연하다. 이 중 하나를 명확히 할 수 있으면 대답을 업데이트 할 수 있습니다.

  • 궁금한 점이 있으시면 ReadLine()을 정확히 두 번 (각 방법에 대해 한 번) 호출하고 싶지 않다고 가정합니다. 나는 당신이 모든 라인을 개별적으로 읽길 원한다고 추측한다. (그 이유는 그것이 바로 TextReader의 작동 방식이기 때문이다.) "좋은"값으로 시작하는지 확인한 다음, 필요한 함수를 실행한다.

원본 예제에서는 특히 2 행을 읽고 구문 분석합니다. 대신 GPS 업데이트에서 모든 라인을 읽으려고하는 경우 다음과 같이 코드를 변경 : serialPortGPS에서 직접 읽는 것이 올바른 접근 방식 인 경우 나

private void serialPortGPS_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    string line; 
    while((line = serialPortGPS.ReadLine()) != null) 
    { 
     if(line.StartsWith("$GNGGA")) 
      GPSDataBilgisi(line); 

     if(line.StartsWith("$GNVTG")) 
      GPSVelocity(line); 
    } 
} 
  • 파트 궁금해. 이것은 순수한 추측이지만 귀하의 SerialDataReceivedEventArgs e에는 새로 수신 된 데이터가있는 속성이 포함될 것으로 예상됩니다. 현재 수행중인 작업이 정확하다는 것은 불가능하지 않지만 업데이트 이벤트에서받은 이벤트 인수를 사용하는 것보다 더 특이한 작업입니다.

  • LINQ를 사용하여 수동으로 반복하는 대신 필요한 행을 즉시 필터링 할 수 있습니다. 그러나 Textreader은 한 번에 한 행만 처리하는 패턴을 구현합니다 (yield return과 유사). LINQ를 사용한다면, 필터를 걸 때 모든 라인을 동시에 처리하게 될 것입니다. 이 필요하면 한 줄씩 처리해야합니다 (예 :당신이 처리하고있는 데이터) 큰 메모리 공간을 가지고 있기 때문에 당신이 LINQ의 예를 원하는 경우에, 당신은 LINQ

을 피해야한다 :

List<string> theLinesThatIWant = 
    allTheLines.Where(line => line.StartsWith("$GNGGA")).ToList() 

을하지만, 내가 말했듯이, 경우에만 사용 동시에 모든 데이터를 메모리에 보유 할 수 있습니다.