如何连续读取和解析高速SerialPort数据

时间:2015-08-15 05:16:32

标签: c# gps serial-port readline continuous

我正在尝试编写C#代码,该代码从高速GPS设备获取串行端口数据并解析数据以获取坐标。

与其他串行GPS设备相比,它的问题在于它每100毫秒喷出5-6行数据,而不是每秒喷出5-6行数据。所以基本上,每0.1秒,我得到5或6行数据突发,只要设备开启,它就会持续持续。

当我在模拟标准速度GPS设备上尝试时,它工作得很好。

这是我每秒钟获得一次5线爆发。但当它加速10倍时,它就会停止工作。基本上,我得到SerialDataReceivedEventHandler的效果根本没有触发。

那么,什么是连续读取基本上是超高速串行端口数据转储的最佳方法?

我的代码如下。对于你的GPS人来说,这个特殊的接收器的波特率是非标准的115200而不是标准的4800.我证实它适用于PuTTY以及适用于Windows的现成GPS软件。

    public List<double[]> coords = new List<double[]>();
    SerialPort com;
        ...
        try
        {
            com = new SerialPort(COMPORT);
            com.BaudRate = 115200;
            com.DataBits = 8;
            com.StopBits = StopBits.One;
            com.Handshake = Handshake.None;
            com.Open();

            com.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }
        catch (Exception e)
        {
            System.Windows.Forms.MessageBox.Show(e.Message);
        }
    }

    public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort port = (SerialPort)sender;
        double longitude = -1000;
        double latitude = -1000;
        double altitude = -1000;
        string sentence = port.ReadLine();
        if (sentence.StartsWith("$GPGGA"))
        {
            string[] values = sentence.Split(',');

            if (values[2].Length > 1 && values.Count() > 10)
            {
                latitude = double.Parse(values[2].Substring(0, values[2].IndexOf('.') - 2));
                latitude += double.Parse(values[2].Substring(values[2].IndexOf('.') - 2)) / 60;
                if (values[3] == "S")
                    latitude = 0 - latitude;
                longitude = double.Parse(values[4].Substring(0, values[4].IndexOf('.') - 2));
                longitude += double.Parse(values[4].Substring(values[4].IndexOf('.') - 2)) / 60;
                if (values[5] == "W")
                    longitude = 0 - longitude;
                altitude = double.Parse(values[9]);

                coords.RemoveAt(0);
                coords.Add(new double[] { longitude, latitude, altitude });
            }

            else
            {
                coords.RemoveAt(0);
                coords.Add(coords.Last());
            }
        }
    }

0 个答案:

没有答案