在第一章中,我写了一个GPSPort类,这个类主要进行从注册表中获取串口,并进行参数设置,同时进行打开串口,关闭串口,读取数据,写数据。 好,下面还有一个类GPS,这个类是主要将获取得到的数据进行解析。 using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; namespace GetGPSInfo { /// <summary> /// GPS业务类 /// </summary> public class GPS { private string path = @"SYSTEM/CurrentControlSet/GPS Intermediate Driver/multiplexer"; private string serialPortValue = "DriverInterface"; /// <summary> /// 设置端口 /// </summary> private int BaudRate = 4800; private byte ByteSize = 8; private byte Parity = 0; private byte StopBits = 1; private int ReadTimeout = 1000; /// <summary> /// 获取手机GPS设备所接收数据的串口 /// </summary> /// <returns></returns> public string GetSerialPort() { return GetSPort(); } /// <summary> /// 获取串口 /// </summary> /// <returns></returns> private string GetSPort() { string port = ""; //定义注册表的KEY值 RegistryKey rk = Registry.LocalMachine; //获取手机的路径 rk = rk.OpenSubKey(path); //获取手机所设置的端口值 port = rk.GetValue(serialPortValue, "null").ToString(); //关闭key值 rk.Close(); //返加key值 return port; } /// <summary> /// 获取GPS信息 /// </summary> /// <returns></returns> public string GetGPSInfos() { return GPSInfo(); } /// <summary> /// GPS信息 /// </summary> /// <returns></returns> private string GPSInfo() { //这个方法可以说是整个GPS信息返回数据的地方,你可以在这里 //返回一个GPS信息对象,我们可以将数据都封装在这个GPS信息对象里面 //提供给调用者. string info = ""; GPSPort gpsport = new GPSPort(); gpsport.PortNum = GetSPort(); gpsport.BaudRate = this.BaudRate; gpsport.ByteSize = this.ByteSize; gpsport.Parity = this.Parity; gpsport.StopBits = this.StopBits; gpsport.ReadTimeout = this.ReadTimeout; OpenPort(gpsport); byte[] temp = gpsport.Read(512); //这里可以再写一层,将数据进行解析提取(我们需要的数据) //为简单介绍这个流程我只将GPS信息返回回来并没有做加工处理 //你可以根据自己的需要,把数据解析出来.直接在这个类中写 //你要解析的方法就可以.比如我写了一个例子就是将NMEA协议的 //“度分”格式转换为十进制“度度”格式 return GetParseGPS(temp); } /// <summary> /// 打开串口 /// </summary> /// <param name="gpsport"></param> private void OpenPort(GPSPort gpsport) { //判断是否已经打开 if (gpsport.ScanPort()) { gpsport.Open(); } } /// <summary> /// 将得到的GPS地址解析成string /// </summary> /// <returns></returns> private string GetParseGPS(byte[] info) { return System.Text.Encoding.ASCII.GetString(info, 0, info.Length); } /// <summary> /// 转换NMEA协议的“度分”格式为十进制“度度”格式 /// </summary> /// <param name="DegreeMinutes"></param> /// <returns></returns> private string DM2DD(string DegreeMinutes) { string sDegree; string sMinute; string sReturn = ""; if (DegreeMinutes.IndexOf(".") == 4) { //DegreeMinutes = Replace(DegreeMinutes, ".", "") //DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) - 2)) / 60), 8)) / 10000 DegreeMinutes = DegreeMinutes.Replace(".", ""); double sDegree1 = Convert.ToDouble(DegreeMinutes.Substring(0, 2)); double sDegree2 = Convert.ToDouble(DegreeMinutes.Substring(2, DegreeMinutes.Length - 2)); string sTmp = Convert.ToString(sDegree2 / 60); sDegree2 = Convert.ToDouble(sTmp.Substring(0, sTmp.Length)); sDegree2 = sDegree2 / 10000; sDegree = Convert.ToString(sDegree1 + sDegree2); if (sDegree.Length > 11) sDegree = sDegree.Substring(0, 11); sReturn = sDegree; } else if (DegreeMinutes.IndexOf(".") == 5) { //DegreeMinutes = Replace(DegreeMinutes, ".", "") //DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) - 2)) / 60), 8)) / 10000 DegreeMinutes = DegreeMinutes.Replace(".", ""); double sMinute1 = Convert.ToDouble(DegreeMinutes.Substring(0, 3)); double sMinute2 = Convert.ToDouble(DegreeMinutes.Substring(3, DegreeMinutes.Length - 3)); string sTmp = Convert.ToString(sMinute2 / 60); sMinute2 = Convert.ToDouble(sTmp.Substring(0, sTmp.Length)); sMinute2 = sMinute2 / 10000; sMinute = Convert.ToString(sMinute1 + sMinute2); if (sMinute.Length > 10) sMinute = sMinute.Substring(0, 10); sReturn = sMinute; } return sReturn; } /// <summary> /// 时间格式的转换 /// </summary> /// <param name="strDate"></param> /// <param name="strTime"></param> /// <returns></returns> private string T2Time(string strDate, string strTime) { string dT = "20" + strDate.Substring(4, 2) + "-" + strDate.Substring(2, 2) + "-" + strDate.Substring(0, 2); string TT = Convert.ToString(Convert.ToInt32(strTime.Substring(0, 2))) + ":" + strTime.Substring(2, 2) + ":" + strTime.Substring(4, 2); DateTime T = Convert.ToDateTime(dT + " " + TT); T = T.AddHours(8); return T.ToString(); } } }