我正在尝试编写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());
}
}
}