2017-05-05 36 views
0

我使用GPS數據和NMEA句子。即使我只想看到並保存在我的richtextbox中以「$ GNGGA」和「$ GNTVG」開頭的句子,還有其他句子(行)開始於不同的代碼($ GNGLL ,$ GLGSV,$ GPGSV等)。我應該怎麼做才能讓「$ GNGGA」和「$ GNTVG」句子到Richtextbox?如何從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'對象嗎?我期望數據來自事件參數,但您的代碼似乎認爲,否則... – Flater

+0

是的,您可以將serialPortGPS假定爲TextReader。 – Quanthema

回答

0

免責聲明
按OP的答覆我的問題,我假設serialPortGPS.ReadLine()作品酷似TextReader.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()兩次(每種方法一次)。我推斷你想單獨閱讀每一行(因爲這通常是如何工作的),檢查它是否以「好」值開始,然後執行需要它的函數。

我的原始示例具體讀取2行並解析它們。如果您是不是想讀從GPS更新所有線,如下更改代碼:我的

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); 
    } 
} 
  • 部分奇蹟,如果直接從serialPortGPS閱讀是正確的做法。這是純粹的猜測,但我希望你的SerialDataReceivedEventArgs e包含新收到的數據的財產。你目前所做的事情是正確的,這不是不可能的,但比使用從更新事件中獲得的事件參數更加不尋常。

  • 您可以使用LINQ立即過濾掉所需的行(而不必手動迭代它們)。但是,Textreader實現了一次僅處理一行的模式(類似於yield return)。如果你使用LINQ,當你想要過濾它們時,你將最終同時處理所有行。如果您需要需要來逐行處理(例如因爲你正在處理的數據有着巨大的內存佔用),那麼你應該避免LINQ

如果你想LINQ的例子:

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

但就像我說的,只有用這個您可以並且樂意同時在內存中存儲所有數據。