如何从Richtextbox中删除不相关的句子?

时间:2017-05-05 07:49:35

标签: c# richtextbox nmea

我使用GPS数据和NMEA句子。即使我只想在我的richtextbox中查看并保存以“$ GNGGA”和“$ GNTVG”开头的句子,还有其他句子(行)以不同的代码开头($ GNGLL,$ GLGSV,$ GPGSV等)。我应该怎么做才能将“$ 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);
        }
    }

1 个答案:

答案 0 :(得分: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”),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包含一个带有新接收数据的属性。您当前正在做的事情是正确的并不是不可能的,但它比使用您从更新事件中收到的事件参数更不寻常。

  • 您可以使用LINQ立即过滤掉您需要的行(而不必手动迭代它们)。但是,Textreader实现了一种模式,它一次只处理一行(类似于yield return)。如果您使用LINQ,那么当您想要过滤它们时,您将最终同时处理所有行。如果您需要逐行处理(例如,因为您正在处理的数据占用大量内存),那么您应该避免使用LINQ

如果你想要一个LINQ的例子:

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

但就像我说的那样,只有在你能够并且愿意同时将所有数据都存储在内存中时才使用它。