如何从Richtextbox删除不依赖的句子



我使用GPS数据和NMEA句子。即使我只想在我的RichTextbox中查看并保存以" $ gngga"one_answers" $ gntvg"开头的句子,还有其他句子(还有其他句子(还有其他句子(线以不同的代码($ gngll,$ glgsv,$ gpgsv等(开头。我该怎么办才能将" $ gngga"one_answers" $ 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);
        }
    }

免责声明
根据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);
   }
}  

如果行以其他任何内容开头(例如" Hellyiamaline"(,则if-if-check都不会通过,并且代码不会对线路做任何事情,它只是移动到下一个。

您可以删除代码中的switch语句,不再需要它们(当然,请保留其中的逻辑!(

这里有一些警告,因为我认为您的代码和意图有些模糊。如果您可以澄清任何一个,我可以更新我的答案。

  • 通过您的问题,我认为您不想恰好调用ReadLine()两次(每种方法一次(。我推断您想单独读取每一行(因为这是TextReader通常的工作方式(,请检查它是否以"良好"值开头,然后执行需要它的函数。

我的原始示例专门读取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包含具有新收到数据的属性。您当前正在做的事情并非不可能是正确的,但是比使用您从更新事件中收到的事件ARG更为不寻常。

  • 您可以使用LINQ立即滤除所需的行(而不是必须在它们上手动迭代(。但是,Textreader实现了一次仅处理一行(类似于yield return(的模式。如果您使用LINQ,则最终将在要过滤它们的同时处理所有行。如果您需要逐行处理(例如,因为您正在处理的数据具有巨大的内存足迹(,则应避免Linq

如果您想要一个linq的示例:

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

,但是就像我说的那样,只有在您能够和愿意同时将所有数据都有所有数据时才使用。

最新更新