GPS-GPZDA数据解析C语言

合集下载

GPS数据解析 数据拆分 坐标转换 显示线路图源代码

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语句字段定义解释)

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接收机

完全手册 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操作系统

用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数据解析代码

GPS数据解析代码
FILE *fi;
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课程设计一、教学目标本课程的目标是让学生掌握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语言

GPS-GPZDA数据解析C语言
2.3.3
这是一种使用没有在标准下预定义的特殊内容的方法。它通常的格式为:$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数据详解

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也将传送)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档