自從Windows Mobile提供了GPSID介面後,極大的省略了操縱Windows Mobile與GPS裝置之間的通訊問題,想當年哥為了讀取外部一個藍芽GPS的資料,又是串口又是線程的,麻煩的很啊!
貌似從WM5.0後開始提供GPSID這一中間驅動介面,極大的簡化了我們的工作,但在用模擬器的調試過程中發現微軟提供的這一介面中有一小小的bug!在微軟提供的GPSID庫中,有一個檔案 GpsPosition.cs 存在bug。
代碼 /// <summary> /// Parses out the degrees, minutes, seconds from the double format returned by /// the NMEA GPS device /// </summary> /// <param name="val">degrees, minutes, seconds as a double</param> /// <returns>DegreesMinutesSeconds structure</returns> private DegreesMinutesSeconds ParseDegreesMinutesSeconds(double val) { if (val < 0) val = -val; //這裡在Windows Mobile5.0下是ddmm.mmmmm的格式 在wm6.0下是dd.dddddd格式 int Marjor = System.Environment.OSVersion.Version.Major; int Minor = System.Environment.OSVersion.Version.Minor; if (Marjor == 5 && Minor == 0) //Windows Mobile 5.0版本 { double degrees = (val / 100.0); double minutes = (Math.Abs(degrees) - Math.Abs((double)(int)(degrees))) * 100; double seconds = (Math.Abs(val) - Math.Abs((double)(int)val)) * 60.0; return new DegreesMinutesSeconds((int)degrees, (int)minutes, seconds); } else { //Windows Mobile 6.0版本 int degrees = (int)(val); double dminutes = (val - degrees) * 60.0; int minutes = (int)dminutes; double seconds = (dminutes - minutes) * 60.0; return new DegreesMinutesSeconds(degrees, minutes, seconds); } }
經過調試和測試,發現在WM5.0和Wm6.0下,這個函數會出現問題,在5.0後6.0下從gps讀取的資料格式是不一樣的,詳細見上面代碼部分的注釋!
必須對這個函數進行改寫,首先第一步必須判斷裝置是採用Windows Mobile 5.0還是Windows Mobile 6.0,通過System.Environment.OSVersion.Version的主要版本和此版本號碼可以擷取目前的裝置是採用的上面版本,我搜了MSDN沒見官方說明如何通過版本號碼來識別Windows Mobile 5.0和Wm6.0,網上有網友很肯定的說
“I believe WM5 is 5.01 and WM6 is 5.02.”(詳見《detect what version of windows mobile device is running》http://social.msdn.microsoft.com/Forums/zh-HK/netfxcompact/thread/8079e32f-b058-4ae7-b334-73eb3f51967e ),經過測試,Wm6確實是5.02通過次版本號碼來確定,見上述代碼。