GPS-GPZDA数据解析C语言
GPS数据解析 数据拆分 坐标转换 显示线路图源代码

view plaincopy to clipboardprint?1. GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn from2.3.4. GPS数据解析5.6. 数据拆分 \坐标转换 \显示线路图\源代码7.8. 逐条读取gps数据然后进行拆分解析,坐标转换,绘制线路。
很好的示例多多交流学习。
9.10.11.12. 本程序是基于VC++ 建立的单文档工程。
13.14.15.16. 废话少说,直接上代码17.18.19.20. //获取子字符串个数21.22. i nt GetSubStrCount(CString str,char cFlag)23.24. {25.26. cFlag = ',';27.28. int i = 0;29.30. BOOL isHas = FALSE;31.32.33.34. for (int iStart = -1; -1 != (iStart = str.Find(cFlag,iStart+1)) ; i++)35.36. {37.38. isHas = TRUE;39.40. }41.42.43.44. if (!isHas)45.46. {47.48. return 0;49.50. }51.52. else53.54. {55.56. return i+1;57.58. }59.60. }61.62.63.64. //获取子字符串65.66. // i 序号 067.68. C String GetSubStr(CString str,int i,char cFlag)69.70. {71.72. cFlag = ',';73.74. int iStart = -1;75.76. int iEnd = 0;77.78. int j = 0;79.80. int iStrCount;81.82.83.84. iStrCount = GetSubStrCount(str,cFlag);85.86.87.88. if (i>iStrCount -1 || i<0)89.90. {91.92. str = "";93.94. return str;95.96. }97.98. else99.100. {101.102. //do nothing104. }105.106.107.108. if (i == iStrCount-1)109.110. {111.112. i = iStrCount;113.114.115.116. for (;j<i-1;j++)117.118. {119.120. iStart = str.Find(cFlag , iStart+1);121.122. }123.124.125.126. return str.Mid(iStart+1 , str.GetLength()-iStart-1); 127.128. }129.130. else131.132. {133.134. //do nothing135.136. }137.139.140. for (; j<i; j++)141.142. {143.144. iStart = str.Find(cFlag , iStart+1);145.146. }147.148.149.150. iEnd = str.Find(cFlag , iStart+1);151.152. return str.Mid(iStart+1 , iEnd-iStart-1);153.154. }155.156.157.158. //数据解析159.160. CString CGpsDataView::Analyzing(CString str)161.162. {163.164. CString subStr[20];165.166. char cFlag = ',';167.168. int j = GetSubStrCount(str,cFlag); //得到该行的子字符串个数169.170. CStdioFile wFile;171.172. wFile.Open("save.txt",CFile::modeCreate | CFile::modeWrite | CFil e::typeText);//将数据写入文件173.174.175.176. for (int i=0;i<j;i++)177.178. {179.180. subStr[i] = GetSubStr(str,i,cFlag); 181.182. }183.184.185.186. //GPGGA数据187.188. if (subStr[0] == "$GPGGA")189.190. {191.192. CoordCovert(subStr[2],subStr[4]);193.194. //提取时间195.196. subStr[1].Insert(2,':');197.198. subStr[1].Insert(5,':');199.200. subStr[1].Insert(0," UTC时间:");201.202.203.204. //提取纬度205.206. if (subStr[3] == 'N')207.208. {209.210. subStr[2].Insert(11,"分"); 211.212. subStr[2].Insert(2,"度"); 213.214. subStr[2].Insert(0," 北纬"); 215.216. }217.218. else if (subStr[3] == 'S')219.220. {221.222. subStr[2].Insert(11,"分"); 223.224. subStr[2].Insert(2,"度"); 225.226. subStr[2].Insert(0," 南纬"); 227.228. }229.230.231.232. //提取经度233.234. if (subStr[5] == 'E')235.236. {237.238. subStr[4].Insert(12,"分"); 239.240. subStr[4].Insert(3,"度");241.242. subStr[4].Insert(0," 东经"); 243.244. }245.246. else if (subStr[5] == 'W')247.248. {249.250. subStr[4].Insert(12,"分");251.252. subStr[4].Insert(3,"度");253.254. subStr[4].Insert(0," 西经"); 255.256. }257.258.259.260. //判断GPS状态261.262. CString GpsState;263.264.265.266. if (subStr[6] == '0')267.268. {269.270. GpsState = " GPS状态:无定位."; 271.272. }273.274. else if (subStr[6] == '1')275.276. {277.278. GpsState = " GPS状态:无差分校正定位."; 279.280. }281.282. else if (subStr[6] == '2')283.284. {285.286. GpsState = " GPS状态:差分校正定位."; 287.288. }289.290. else if (subStr[6] == '9')291.292. {293.294. GpsState = " GPS状态:用星历计算定位."; 295.296. }297.298.299.300. //提取卫星数301.302. subStr[7].Insert(0," 卫星数:");303.304.305.306. //提取平面位置精度因子307.308. subStr[8].Insert(0," 平面位置精度因子:"); 309.310.311.312. //天线海拔高度313.314. subStr[9].Insert(strlen(subStr[9]),subStr[10]); 315.316. subStr[9].Insert(0," 天线海拔高度:");317.318.319.320. //海平面分离度321.322. subStr[11].Insert(strlen(subStr[11]),subStr[12]); 323.324. subStr[11].Insert(0," 海平面分离度:");325.326.327.328. subStr[0] += subStr[1];329.330. subStr[0] += subStr[2];331.332. subStr[0] += subStr[4];333.334. subStr[0] += GpsState;335.336. subStr[0] += subStr[7];337.338. subStr[0] += subStr[8];339.340. subStr[0] += subStr[9];341.342. subStr[0] += subStr[11];343.344. //////////////////////////////////////MessageBox(subStr[0]); 345.346. wFile.WriteString(subStr[0]);//将数据写入文件347.348.349.350. }351.352.353.354. //GPZDA数据355.356. else if (subStr[0] == "$GPZDA")357.358. {359.360. //提取时间361.362. subStr[1].Insert(2,':');363.364. subStr[1].Insert(5,':');365.366. subStr[1].Insert(0," UTC时间:");367.368.369.370. //提取日期371.372. subStr[2].Insert(strlen(subStr[2]),"日"); 373.374. subStr[2].Insert(0,"月");375.376. subStr[2].Insert(0,subStr[3]);377.378. subStr[2].Insert(0,"年");379.380. subStr[2].Insert(0,subStr[4]);382. subStr[2].Insert(0,' ');383.384.385.386. //当地时域描述387.388. subStr[5].Insert(strlen(subStr[5]),"小时"); 389.390.391.392. if (strlen(subStr[6]) > 3)393.394. {395.396. subStr[6] = subStr[6].Left(2);397.398. }399.400. else401.402. {403.404. subStr[6] = '0';405.406. }407.408.409.410. subStr[6] += "分";411.412. subStr[6].Insert(0,subStr[5]);413.414. subStr[6].Insert(0," 当地时域:");415.417.418. subStr[0] += subStr[1];419.420. subStr[0] += subStr[2];421.422. subStr[0] += subStr[6];423.424. //////////////////////////////MessageBox(subStr[0]); 425.426. wFile.WriteString(subStr[0]);//将数据写入文件427.428. }429.430.431.432. //GPGSA数据433.434. else if (subStr[0] == "$GPGSA")435.436. {437.438. //卫星捕获模式,以及定位模式439.440. CString CatchLocation;441.442.443.444. if (subStr[1] == 'M')445.446. {447.448. if (subStr[2] == '1')449.450. {452. CatchLocation = " 手动捕获卫星,未定位!"; 453.454. }455.456. else if (subStr[2] == '2')457.458. {459.460. CatchLocation = " 手动捕获卫星,2D定位!"; 461.462. }463.464. else if (subStr[2] == '3')465.466. {467.468. CatchLocation = " 手动捕获卫星,3D定位!"; 469.470. }471.472. }473.474. else if (subStr[1] == 'A')475.476. {477.478. if (subStr[2] == '1')479.480. {481.482. CatchLocation =" 自动捕获卫星,未定位!"; 483.484. }485.486. else if (subStr[2] == '2')487.488. {489.490. CatchLocation =" 自动捕获卫星,2D定位!"; 491.492. }493.494. else if (subStr[2] == '3')495.496. {497.498. CatchLocation =" 自动捕获卫星,3D定位!"; 499.500. }501.502. }503.504.505.506. //各卫星定位结果507.508. subStr[3].Insert(0," 各卫星定位结果:");509.510. subStr[3] += ' ';511.512. subStr[4].Insert(0,subStr[3]);513.514. subStr[4] += ' ';515.516. subStr[5].Insert(0,subStr[4]);517.518. subStr[5] += ' ';519.520. subStr[6].Insert(0,subStr[5]);522. subStr[6] += ' ';523.524. subStr[7].Insert(0,subStr[6]); 525.526. subStr[7] += ' ';527.528. subStr[8].Insert(0,subStr[7]); 529.530. subStr[8] += ' ';531.532. subStr[9].Insert(0,subStr[8]); 533.534. subStr[9] += ' ';535.536. subStr[10].Insert(0,subStr[9]); 537.538. subStr[10] += ' ';539.540. subStr[11].Insert(0,subStr[10]); 541.542. subStr[11] += ' ';543.544. subStr[12].Insert(0,subStr[11]); 545.546. subStr[12] += ' ';547.548. subStr[13].Insert(0,subStr[12]); 549.550. subStr[13] += ' ';551.552. subStr[14].Insert(0,subStr[13]); 553.554. subStr[14] += ' ';555.557.558. //空间(三维)位置精度因子559.560. subStr[15].Insert(0," 空间(三维)位置精度因子:"); 561.562.563.564. //平面位置精度因子565.566. subStr[16].Insert(0," 平面位置精度因子:");567.568.569.570. //高度位置精度因子571.572. subStr[17] = subStr[17].Left(3);573.574. subStr[17].Insert(0," 高度位置精度因子:");575.576.577.578. subStr[0] += CatchLocation;579.580. subStr[0] += subStr[14];581.582. subStr[0] += subStr[15];583.584. subStr[0] += subStr[16];585.586. subStr[0] += subStr[17];587.588. /////////////////////////////MessageBox(subStr[0]);589.590. wFile.WriteString(subStr[0]);//将数据写入文件592. }593.594.595.596. //GPGSV数据597.598. else if (subStr[0] == "$GPGSV")599.600. {601.602. ///////////////////////////MessageBox(subStr[0]);603.604.605.606. //卫星编号、卫星仰角(0~90度)、卫星方位角(0~359度)、信噪比607.608. subStr[4].Insert(0,"卫星编号:");609.610. subStr[5].Insert(0," 仰角:");611.612. subStr[6].Insert(0," 方位角:");613.614. subStr[7].Insert(0," 信噪比:");615.616. subStr[4] += subStr[5];617.618. subStr[4] += subStr[6];619.620. subStr[4] += subStr[7];621.622. ///////////////////MessageBox(subStr[4]);623.624. subStr[8].Insert(0,"卫星编号:");626. subStr[9].Insert(0," 仰角:");627.628. subStr[10].Insert(0," 方位角:");629.630. subStr[11].Insert(0," 信噪比:");631.632. subStr[8] += subStr[9];633.634. subStr[8] += subStr[10];635.636. subStr[8] += subStr[11];637.638. ////////////////////////MessageBox(subStr[8]); 639.640. subStr[12].Insert(0,"卫星编号:"); 641.642. subStr[13].Insert(0," 仰角:");643.644. subStr[14].Insert(0," 方位角:");645.646. subStr[15].Insert(0," 信噪比:");647.648. subStr[12] += subStr[13];649.650. subStr[12] += subStr[14];651.652. subStr[12] += subStr[15];653.654. /////////////////////MessageBox(subStr[12]); 655.656. subStr[16].Insert(0,"卫星编号:"); 657.658. subStr[17].Insert(0," 仰角:");659.660. subStr[18].Insert(0," 方位角:");661.662.663.664. if (strlen(subStr[19]) > 3)665.666. {667.668. subStr[19] = subStr[19].Left(2);669.670. }671.672. else673.674. {675.676. subStr[19] = '0';677.678. }679.680.681.682. subStr[19].Insert(0," 信噪比:");683.684. subStr[16] += subStr[17];685.686. subStr[16] += subStr[18];687.688. subStr[16] += subStr[19];689.690. /////////////////////////////////MessageBox(subStr[16]); 691.692. wFile.WriteString(subStr[16]);//将数据写入文件693.694. }695.696. return str;697.698. }699.700.701.702.703.704. //读取文件数据并解析705.706. void CGpsDataView::OnFileRead()707.708. {709.710. // TODO: 在此添加命令处理程序代码711.712. CStdioFile myFile;713.714. CString oneLine;715.716. char cFlag = ',';717.718. CString subStr[20];719.720.721.722. //读取GPS数据文件723.724. if(!myFile.Open(("gps.txt"),CFile::modeRead | CFile::typeText)) 725.726. {727.728. AfxMessageBox(_T("打开文件错误!"));729.730. return;731.732. }733.734. else735.736. {737.738. /*do nothing*/739.740. }741.742.743.744. while (myFile.ReadString(oneLine))//读一行745.746. {747.748. //////////MessageBox(oneLine);749.750. int j = GetSubStrCount(oneLine,cFlag); //得到该行的子字符串个数751.752.753.754. //校验755.756. if(CheckNum(oneLine))757.758. {759.760. ////////////MessageBox(_T("数据校验...接收正确!...")); 761.762.763.764. for (int i=0;i<j;i++)765.766. {767.768. subStr[i] = GetSubStr(oneLine,i,cFlag); 769.770. //MessageBox(subStr[i]); 771.772. }773.774.775.776. Analyzing(oneLine); //解析777.778. }779.780. else781.782. {783.784. AfxMessageBox(_T("数据校验..接收错误!...")); 785.786. }787.788. }789.790.791.792. myFile.Close();793.794. }795.796.797.798. //******************************************************************************* ****************799.800. //坐标转换801.802.803.804. //度分秒--弧度805.806. double Dms2Rad(double Dms)807.808. {809.810. double Degree, Miniute;811.812. double Second;813.814. int Sign;815.816. double Rad;817.818.819.820. if(Dms >= 0)821.822. {823.824. Sign = 1;825.826. }827.828. else829.830. {831.832. Sign = -1;833.834. }835.836.837.838. Dms = fabs(Dms); //绝对值839.840. Degree = floor(Dms); // 取度 floor(2.800) = 2.0000841.842. Miniute = floor(fmod(Dms * 100.0, 100.0)); //fmod 计算余数843.844. Second = fmod(Dms * 10000.0, 100.0);845.846. Rad = Sign * (Degree + Miniute / 60.0 + Second / 3600.0) * PI / 180.0;847.848. return Rad;849.850. }851.852.853.854. double Rad2Dms(double Rad)855.856. {857.858. double Degree, Miniute;859.860. double Second;861.862. int Sign;863.864. double Dms;865.867.868. if(Rad >= 0)869.870. {871.872. Sign = 1;873.874. }875.876. else877.878. {879.880. Sign = -1;881.882. }883.884.885.886. Rad = fabs(Rad * 180.0 / PI);887.888. Degree = floor(Rad);889.890. Miniute = floor(fmod(Rad * 60.0, 60.0));891.892. Second = fmod(Rad * 3600.0, 60.0);893.894. Dms = Sign * (Degree + Miniute / 100.0 + Second / 10000.0); 895.896. return Dms;897.898. }899.900.902. //正算公式903.904. bool GpsPoint::BL2xy()905.906. {907.908. //大地测量学基础(吕志平乔书波北京:测绘出版社 2010.03)909.910.911.912. double X; //由赤道至纬度为B的子午线弧长(P106 5-41)913.914. double N; //椭球的卯酉圈曲率半径915.916. double t;917.918. double t2;919.920. double m;921.922. double m2;923.924. double ng2;925.926. double cosB;927.928. double sinB;929.930.931.932. X = A1 * B * 180.0 / PI + A2 * sin(2 * B)933.934. + A3 * sin(4 * B) + A4 * sin(6 * B);935.937.938. sinB = sin(B);939.940. cosB = cos(B);941.942. t = tan(B);943.944. t2 = t * t;945.946.947.948. N = a /sqrt(1 - e2 * sinB * sinB);949.950. m = cosB * (L - L0);951.952. m2 = m * m;953.954. ng2 = cosB * cosB * e2 / (1 - e2);955.956.957.958. //P156 (6-63公式)959.960. x = X + N * t *(( 0.5 + ( (5 - t2 + 9 * ng2 + 4 * ng2 * ng2) 961.962. / 24.0 + (61 - 58 * t2 + t2 * t2) * m2 / 720.0) * m2)* m2); 963.964.965.966. y = N * m * ( 1 + m2 * ( (1 - t2 + ng2) / 6.0 + m2 * ( 5 - 18 * t2 + t2 * t2967.968. + 14 * ng2 - 58 * ng2 * t2 ) / 120.0));969.971.972. //y += 500000;973.974.975.976. return true;977.978. }979.980.981.982. //反算公式983.984. bool GpsPoint::xy2BL()985.986. {987.988. double sinB;989.990. double cosB;991.992. double t;993.994. double t2;995.996. double N; //椭球的卯酉圈曲率半径997.998. double ng2;999.1000. double V;1001.1002. double yN;1003.1004. double preB0;1006. double B0;1007.1008. double eta;1009.1010. //y -= 500000;1011.1012. B0 = x / A1;1013.1014.1015.1016. do1017.1018. {1019.1020. preB0 = B0;1021.1022. B0 = B0 * PI / 180.0;1023.1024. B0 = (x - (A2 * sin(2 * B0) + A3 * sin(4 * B0) + A4 * sin(6 * B0 ))) / A1;1025.1026. eta = fabs(B0 - preB0);1027.1028. }while(eta > 0.000000001);1029.1030.1031.1032. B0 = B0 * PI / 180.0;1033.1034. B = Rad2Dms(B0);1035.1036. sinB = sin(B0);1037.1038. cosB = cos(B0);1040. t = tan(B0);1041.1042. t2 = t * t;1043.1044. N = a / sqrt(1 - e2 * sinB * sinB);1045.1046. ng2 = cosB * cosB * e2 / (1 - e2);1047.1048. V = sqrt(1 + ng2);1049.1050. yN = y / N;1051.1052.1053.1054. B = B0 - (yN * yN - (5 + 3 * t2 + ng2 - 9 * ng2 * t2) * yN * yN * yN * yN1055.1056. / 12.0 + (61 + 90 * t2 + 45 * t2 * t2) * yN * yN * yN * yN * y N * yN / 360.0)1057.1058. * V * V * t / 2;1059.1060.1061.1062. L = L0 + (yN - (1 + 2 * t2 + ng2) * yN * yN * yN / 6.0 + (5 + 28 * t2 + 241063.1064. * t2 * t2 + 6 * ng2 + 8 * ng2 * t2) * yN * yN * yN * yN * yN / 120.0) / cosB;1065.1066. return true;1067.1068. }1069.1071.1072. //设置中央子午线1073.1074. bool GpsPoint::SetL0(double dL0)1075.1076. {1077.1078. L0 = Dms2Rad(dL0);1079.1080. return true;1081.1082. }1083.1084.1085.1086. //将度分秒经纬度转换为弧度后再转换为平面坐标1087.1088. bool GpsPoint::SetBL(double dB, double dL) 1089.1090. {1091.1092. B = Dms2Rad(dB);1093.1094. L = Dms2Rad(dL);1095.1096. BL2xy();1097.1098. return true;1099.1100. }1101.1102.1103.1104. bool GpsPoint::GetBL(double *dB, double *dL)1106. {1107.1108. *dB = Rad2Dms(B);1109.1110. *dL = Rad2Dms(L);1111.1112. return true;1113.1114. }1115.1116.1117.1118. //将平面坐标转换为(弧度)经纬度1119.1120. bool GpsPoint::Setxy(double dx, double dy) 1121.1122. {1123.1124. x = dx;1125.1126. y = dy;1127.1128. xy2BL();1129.1130. return true;1131.1132. }1133.1134.1135.1136. bool GpsPoint::Getxy(double *dx, double *dy) 1137.1138. {1139.1140. *dx = x;1141.1142. *dy = y;1143.1144. return true;1145.1146. }1147.1148.1149.1150. GpsPoint_Krasovsky::GpsPoint_Krasovsky()1151.1152. {1153.1154. a = 6378245; //长半径1155.1156. f = 298.3; //扁率的倒数(扁率:(a-b)/a)1157.1158. e2 = 1 - ((f - 1) / f) * ((f - 1) / f); //第一偏心率的平方1159.1160. e12 = (f / (f - 1)) * (f / (f - 1)) - 1; //第二偏心率的平方1161.1162.1163.1164. // 克拉索夫斯基椭球1165.1166. A1 = 111134.8611;1167.1168. A2 = -16036.4803;1169.1170. A3 = 16.8281;1171.1172. A4 = -0.0220;1173.1174. }1175.1176.1177.1178. //*************坐标转换1179.1180. bool CGpsDataView::CoordCovert(CString latitude, CString longitude)1181.1182. {1183.1184. double bbb = atof(latitude);1185.1186. double lll = atof(longitude);1187.1188.1189.1190. //度分格式转换为度分秒格式1191.1192. bbb = Dm2Dms(bbb);1193.1194. lll = Dm2Dms(lll);1195.1196.1197.1198. double MyL0 ; //中央子午线1199.1200. double MyB = bbb ; //33 d 44 m 55.6666 s1201.1202. double MyL = lll ; //3度带,109 d 22 m 33.4444 s1203.1204.1205.1206. //计算当地中央子午线 ,3度带1207.1208. MyL0 = fabs(MyL);1209.1210. MyL0 = floor(MyL);1211.1212. MyL0 = 3 * floor(MyL0 / 3 );1213.1214.1215.1216. GpsPoint_Krasovsky MyPrj;1217.1218. MyPrj.SetL0(MyL0);1219.1220. MyPrj.SetBL(MyB, MyL);1221.1222. double OutMyX;1223.1224. double OutMyY;1225.1226. OutMyX = MyPrj.x; //正算结果:坐标x 1227.1228. OutMyY = MyPrj.y; //结果:坐标y 1229.1230.1231.1232. CString strTemp1;1233.1234. CString strTemp2;1235.1236. CString strTemp3;1237.1238. CString strTemp4;1239.1240.1241.1242. strTemp1.Format("%f",OutMyX);1244. strTemp2.Format("%f",OutMyY); 1245.1246. strTemp1.Insert(0,"x = "); 1247.1248. strTemp2.Insert(0," , y = "); 1249.1250. strTemp2.Insert(0,strTemp1); 1251.1252. strTemp2.Insert(0," 坐标转换: "); 1253.1254.1255.1256. strTemp3.Format("%f12",MyB); 1257.1258. strTemp4.Format("%f12",MyL); 1259.1260. strTemp3.Insert(0,"B = "); 1261.1262. strTemp4.Insert(0," L = "); 1263.1264. strTemp4.Insert(0,strTemp3); 1265.1266. strTemp2.Insert(0,strTemp4); 1267.1268. //MessageBox(strTemp2); 1269.1270.1271.1272. DrawPoint(MyPrj.x,MyPrj.y); 1273.1274.1275.1276. return true;1277.1279.1280.1281.1282. //================================== 1283.1284. //度分格式转换为度分秒格式1285.1286. double CGpsDataView::Dm2Dms(double Dm) 1287.1288. {1289.1290. double Dms;1291.1292. double temp;1293.1294. temp = Dm - floor(Dm);1295.1296. temp = (temp * 60) / 100;1297.1298. Dm = floor(Dm);1299.1300. Dm += temp;1301.1302. Dm = Dm /100;1303.1304. Dms = Dm;1305.1306. return Dms;1307.1308. }1309.1310.1311.1312.1314.1315.1316.1317.1318. //*************绘制线路显示出路线1319.1320. int count1=0;1321.1322. bool bFirst = true;1323.1324. double xTemp;1325.1326. double yTemp;1327.1328. void CGpsDataView::DrawPoint(double X, double Y) 1329.1330. {1331.1332. Sleep(100);1333.1334.1335.1336. //X = (X - floor(X))*100;1337.1338. //Y = (Y - floor(Y))*100;1339.1340.1341.1342. if (bFirst)1343.1344. {1345.1346. xTemp=X;1347.1348. yTemp=Y;1349.1350. bFirst=false;1351.1352. }1353.1354.1355.1356. CDC *pDC=GetDC();1357.1358. CPen pen(PS_SOLID,3,RGB(255,20,20));1359.1360. CPen *pOldPen;1361.1362. CBrush *pOldBrush;1363.1364. CBrush *pBrush=CBrush::FromHandle( (HBRUSH)GetStockObjec t(NULL_BRUSH) );1365.1366.1367.1368. pOldPen=pDC->SelectObject(&pen);1369.1370. pOldBrush=pDC->SelectObject(pBrush);1371.1372.1373.1374. int a=(int)(100.0-(X-xTemp)*800.0);1375.1376. int b=(int)(100.0+(Y-yTemp)*800.0);1377.1378.1379.1380. //绘制点显示路径1381.1382. pDC->Ellipse(a,b,a+5,b+5);1383.1384.1385.1386. //计数1387.1388. count1=count1+1;1389.1390. pDC->SelectObject( pOldBrush );1391.1392. pDC->SelectObject( pOldPen );1393.1394.1395.1396. CString str;1397.1398. str.Format("%.1f,%.1f,%d,%d,%d",X-xTemp,Y-yTemp,a,b,count1);1399.1400. pDC->TextOut(10,10,str);1401.1402. }。
GPS信息原型及解析(常用NMEA-0183语句字段定义解释)

NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。
GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA 等设备。
NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。
不过,也有少数厂商的设备使用自行约定的协议比如GARMIN的GPS设备(部分GARMIN设备也可以输出兼容NMEA-0183协议的数据)。
软件方面,我们熟知的Google Earth目前也不支持NMEA-0183协议,但Google Earth已经声明会尽快实现对NMEA-0183协议的兼容。
呵呵,除非你确实强壮到可以和工业标准分庭抗礼,否则你就得服从工业标准。
NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。
下面给出这些常用NMEA-0183语句的字段定义解释。
$GPGGA例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1 F字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data (GGA)GPS定位信息字段1:UTC 时间,hhmmss.sss,时分秒格式字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)字段3:纬度N(北纬)或S(南纬)字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)字段5:经度E(东经)或W(西经)字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)字段8:HDOP水平精度因子(0.5 - 99.9)字段9:海拔高度(-9999.9 - 99999.9)字段10:地球椭球面相对大地水准面的高度字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)字段13:校验值$GPGSA例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息字段1:定位模式,A=自动手动2D/3D,M=手动2D/3D字段2:定位类型,1=未定位,2=2D定位,3=3D定位字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段15:PDOP综合位置精度因子(0.5 - 99.9)字段16:HDOP水平精度因子(0.5 - 99.9)字段17:VDOP垂直精度因子(0.5 - 99.9)字段18:校验值$GPGSV例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息字段1:本次GSV语句的总数目(1 - 3)字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)字段5:卫星仰角(00 - 90)度(前导位数不足则补0)字段6:卫星方位角(00 - 359)度(前导位数不足则补0)字段7:信噪比(00-99)dbHz字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)字段9:卫星仰角(00 - 90)度(前导位数不足则补0)字段10:卫星方位角(00 - 359)度(前导位数不足则补0)字段11:信噪比(00-99)dbHz字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)字段13:卫星仰角(00 - 90)度(前导位数不足则补0)字段14:卫星方位角(00 - 359)度(前导位数不足则补0)字段15:信噪比(00-99)dbHz字段16:校验值$GPRMC例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A* 50字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息字段1:UTC时间,hhmmss.sss格式字段2:状态,A=定位,V=未定位字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)字段4:纬度N(北纬)或S(南纬)字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)字段6:经度E(东经)或W(西经)字段7:速度,节,Knots字段8:方位角,度字段9:UTC日期,DDMMYY格式字段10:磁偏角,(000 - 180)度(前导位数不足则补0)字段11:磁偏角方向,E=东W=西字段16:校验值$GPVTG例:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed (VTG)地面速度信息字段1:运动角度,000 - 359,(前导位数不足则补0)字段2:T=真北参照系字段3:运动角度,000 - 359,(前导位数不足则补0)字段4:M=磁北参照系字段5:水平运动速度(0.00)(前导位数不足则补0)字段6:N=节,Knots字段7:水平运动速度(0.00)(前导位数不足则补0)字段8:K=公里/时,km/h字段9:校验值$GPGLL例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)字段2:纬度N(北纬)或S(南纬)字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)字段4:经度E(东经)或W(西经)字段5:UTC时间,hhmmss.sss格式字段6:状态,A=定位,V=未定位字段7:校验值1、GPS DOP and Active Satellites(GSA)当前卫星信息$GPGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>, <6>*hh<CR><LF><1> 模式,M=手动,A=自动<2> 定位类型,1=没有定位,2=2D定位,3=3D定位<3> PRN码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
完全手册 51单片机C语言开发详解系列之第13章 综合实例――GPS接收机

13.4.1 KS0713简介
KS0713是一款集成的图形点阵LCD液晶驱动器,具有65 个公共端和132字段的液晶驱动电路。KS0713能够直接 与单片机进行连接使用,通信接口包括串行和并行接口。 KS0713内置了一块on-chip显示数据RAM,大小为 65×132,因此处理器只需要更改KS0713内置RAM的内 容即可以更改液晶的现实内容,而不需要实时刷新,因 此给显示带来极大的灵活性与便利。
13.4.9 KS0713的控制指令
单片机通过调用KS0713的控制指令间接地控制LCD液晶屏的显示、开关、 亮度以及内存中的数据,如图所示,KS0713共有24条不同的指令。这些指 令可以分为以下几个部分。
13.4.10 读显示数据指令Read Display Data
该指令读取当前地址的一个8位字节数据,该指令只在 KS0713的并行接口模式下有效,此时RS和RW引脚均为 高,如图所示。
13.4 GPS接收机显示终端——点阵型LCD液晶
GPS收发器接收GPS定位信号,经过AT89S51进行解码处理后,需要显示 给最终用户,用于定位、导航或者测量使用。这即是GPS接收机的人机交 互界面,本章采用了点阵型LCD液晶屏作为GPS接收机的最终显示设备。 点阵型LCD液晶屏具有以下一些优点: 耗电量低; 分辨率高; 接口灵活,方便各型号单片机使用。 显示界面灵活;
13.3.2 定位信息GPGGA帧
GPGGA是GPS定位信息帧,包含了GPS卫星时间、位置 以及确定数据需要的其他参数,如可用卫星数等等。 GPGGA的格式定义如下。 $GPGGA,hhmmss.ss,Latitude,N,Longitude,E,FS,NoSV,HD OP,msl,m,Altref,m,DiffAge,DiffStation*cs<CR><LF>
用C#读取GPS数据的基类,适用于wince操作系统

using System;using System.Runtime.InteropServices;using System.Text;namespace BaseStationPDA{class GPS{public string PortNum;public int BaudRate;public byte ByteSize;public byte Parity; // 0-4=no,odd,even,mark,spacepublic byte StopBits; // 0,1,2 = 1, 1.5, 2public int ReadTimeout;//comm port win32 file handleprivate int hComm = -1;public bool Opened = false;//win32 api constantsprivate const uint GENERIC_READ = 0x80000000;private const uint GENERIC_WRITE = 0x40000000;private const int OPEN_EXISTING = 3;private const int INVALID_HANDLE_VALUE = -1;[StructLayout(LayoutKind.Sequential)]public struct DCB{//taken from c struct in platform sdkpublic int DCBlength; // sizeof(DCB)public int BaudRate; // 指定当前波特率 current baud rate // these are the c struct bit fields, bit twiddle flag to setpublic int fBinary; // 指定是否允许二进制模式,在windowsArray5中必须主TRUE binary mode, no EOF checkpublic int fParity; // 指定是否允许奇偶校验 enable parity checkingpublic int fOutxCtsFlow; // 指定CTS是否用于检测发送控制,当为TRUE是CTS为OFF,发送将被挂起。
GPS数据解析代码

int fd;
char gps_buff[512];
int timesync; // 时钟同步标志,如果有此标志,同步完成就退出程序
int real; // 实数据发出模式
int to_pm;
//int to_lcd;
void writetofile( void );
#include <errno.h>
#include <signal.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include "../include/gps.h"
//
static void proc_gps( char *buff, int length )
{
int i;
for(i=0; i<length; i++)
{
if (buff[i] == '$') // 检查是否有开头
{
s_index = 1;
sbuff[0] = buff[i];
{
write(2, "ERROR1", 6);
close(fd);
exit(1);
}
fi = fdopen(fd, "r");
if (fi<=0)
{
write(2, "ERROR2", 6);
c语言gps课程设计

c语言 gps课程设计一、教学目标本课程的目标是让学生掌握C语言在GPS领域的应用。
通过本课程的学习,学生将能够:1.理解GPS系统的基本原理和工作流程。
2.掌握C语言的基本语法和编程技巧。
3.能够使用C语言进行GPS数据的采集、解析和处理。
4.能够利用C语言实现简单的GPS导航功能。
二、教学内容本课程的教学内容主要包括以下几个部分:1.GPS系统的基本原理和工作流程。
2.C语言的基本语法和编程技巧。
3.GPS数据的采集、解析和处理。
4.GPS导航功能的实现。
三、教学方法为了达到本课程的教学目标,我们将采用多种教学方法,包括:1.讲授法:用于讲解GPS系统的基本原理和工作流程,以及C语言的基本语法和编程技巧。
2.案例分析法:通过分析具体的GPS应用案例,让学生了解GPS技术的实际应用。
3.实验法:通过实验让学生亲手操作,掌握GPS数据的采集、解析和处理方法,以及实现简单的导航功能。
四、教学资源为了支持本课程的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选用合适的C语言和GPS相关教材,为学生提供理论学习的参考。
2.参考书:提供相关的参考书籍,拓展学生的知识面。
3.多媒体资料:制作课件和视频资料,直观地展示GPS系统和C语言的相关内容。
4.实验设备:准备GPS接收器、计算机等实验设备,让学生进行实际操作。
五、教学评估为了全面、客观地评估学生在C语言GPS课程中的学习成果,我们将采取以下评估方式:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现来评估其学习态度和理解程度。
2.作业:布置与课程内容相关的编程作业,评估学生对C语言编程和GPS应用的掌握情况。
3.考试:定期进行理论知识考试和编程实践考试,全面评估学生的知识掌握和实际应用能力。
4.项目报告:要求学生完成一个GPS相关的编程项目,通过项目报告评估学生的综合应用能力。
六、教学安排本课程的教学安排如下:1.教学进度:按照教材和大纲进行,确保覆盖所有重要知识点。
GPS-GPZDA数据解析C语言

这是一种使用没有在标准下预定义的特殊内容的方法。它通常的格式为:$PmmmA,df1,df2,....,[CR][LF]P说明是属性内容,mmm定义为厂商信息代码,A(A-Z)表明信息类型。
NMEA-0183协议定义的语句非常的多,主要有$GPGLL、 $GPGGA、$GPVTG、$GPZDA等。因为本次课题我们需要使用GPS-GPZDA进行数据解析所以我们只介绍GPZDA标准格式的样式。
2.3.2
查询的标准格式为:$ttllQ,sss,[CR][LF]
前面两个字符表示请求者的信息源的识别码,后面两个字符是被查询设备的识别码,最后一个字符说明这是一个查询的信息。紧跟着的字符(SSS)包含了三个字的被查询内容的记忆信息。例如: $CCGPQ,ZDA[CR][LF] “CC”说明计算机正从“GP”这个设备查询ZDA中的内容。GPS将会每隔1秒发送内容直到有新的请求。
char chhour[5]={'\0'};
char chmin[5]={'\0'};
char chsec[8]={'\0'};
char chsum[10]={'\0'};
char afterch[128]={'\0'};
int i,j,n,m; /*定义并初始化一些数组,指针,整型变量等用于后续程序使用*/
通过这次课程设计我们可以了解,如何用GPZDA解析GPS的时间信号,在计算机上输出普通用户所能理解的语句,让用户能够在时间信息这方面更加精确地得到信息,给用户提供更可靠的更高水准的服务。
第一章
GPS全球卫星定位系统由21颗工作卫星和3颗备用卫星组成。它们分布在6个等间距的轨道平面上,每个轨道面上有4颗工作卫星。GPS能覆盖全球,能够连续、实时、隐蔽地定位,一次定位时间仅几秒到十几秒,用户不发射任何电磁信号,只要接受卫星导航信号即可定位,所以可全天候昼夜作业。
GPS数据详解

gps数据格式单片机技术2008-03-18 11:58 阅读584 评论0 字号:大大中中小小a.GPS 固定数据输出语句($GPGGA)这是一帧GPS定位的主要数据,也是使用最广的数据。
$GPGGA语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,水平精确度,海拔高度,高度单位,大地水准面高度,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符<CR>和换行符<LF>),分别用14个逗号进行分隔。
该数据帧的结构及各字段释义如下:$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF> $GPGGA:起始引导符及语句格式说明(本句为GPS定位数据);<1> UTC时间,格式为hhmmss.sss;<2> 纬度,格式为ddmm.mmmm(第一位是零也将传送);<3> 纬度半球,N或S(北纬或南纬)<4> 经度,格式为dddmm.mmmm(第一位零也将传送);<5> 经度半球,E或W(东经或西经)<6> 定位质量指示,0=定位无效,1=定位有效;<7> 使用卫星数量,从00到12(第一个零也将传送)<8> 水平精确度,0.5到99.9<9> 天线离海平面的高度,-9999.9到9999.9米M 指单位米<10> 大地水准面高度,-9999.9到9999.9米M 指单位米<11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量<12> 差分参考基站标号,从0000到1023(首位0也将传送)。