gnss_decode.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. #include <string.h>
  2. #include <stdio.h>
  3. typedef struct
  4. {
  5. int hh;
  6. int mm;
  7. int ss;
  8. int sss;
  9. }UTCtimeStruct_ts;
  10. typedef struct
  11. {
  12. /*1*/char ID[5]; //消息 ID,GGA 语句头,’--‘为系统标识
  13. /*2*/UTCtimeStruct_ts UTCtime; //hhmmss.sss 当前定位的 UTC 时间
  14. /*3*/float lat; //ddmm.mmmm 纬度,前 2 字符表示度,后面的字符表示分
  15. /*4*/char uLat; //字符 纬度方向:N-北,S-南
  16. /*5*/float lon; //dddmm.mmmm 经度,前 3 字符表示度,后面的字符表示分
  17. /*6*/char uLon; //字符 经度方向:E-东,W-西
  18. /*7*/int FS; //数值 指示当前定位质量(备注[1]),该字段不应为空
  19. // 定位质量标志 描述
  20. // 0 定位不可用或无效
  21. // 1 SPS 定位模式,定位有效
  22. // 6 估算模式(航位推算)仅 NMEA 2.3 及以上版本有效
  23. /*8*/int numSv; //数值 用于定位的卫星数目,00~24
  24. /*9*/float HDOP; //数值 水平精度因子(HDOP)
  25. /*10*/float msl; //数值 海拔高度,即接收机天线相对于大地水准面的高度
  26. /*11*/char uMsl; //字符 高度单位,米,固定字符 M
  27. /*12*/float sep; //数值 参考椭球面与大地水准面之间的距离,“-”表示大地水准面低于参考椭球面
  28. /*13*/char uSep; //字符 高度单位,米,固定字符 M
  29. /*14*/int diffAge; //数值 差分修正的数据龄期,未使用DGPS 时该域为空
  30. /*15*/int diffSta; //数值 差分参考站的 ID
  31. /*16*/int CS; //校验和,$和*之间(不包括$和*)所有字符的异或结果
  32. }GPGGA_Struct_ts;
  33. typedef struct
  34. {
  35. /*1*/char ID[5]; //消息 ID,GGA 语句头,’--‘为系统标识
  36. /*2*/float lat; //ddmm.mmmm 纬度,前 2 字符表示度,后面的字符表示分
  37. /*3*/char uLat; //字符 纬度方向:N-北,S-南
  38. /*4*/float lon; //dddmm.mmmm 经度,前 3 字符表示度,后面的字符表示分
  39. /*5*/char uLon; //字符 经度方向:E-东,W-西
  40. /*6*/UTCtimeStruct_ts UTCtime; //hhmmss.sss 当前定位的 UTC 时间
  41. /*7*/char valid; //字符 数据有效性(备注[1])
  42. // 备注[1]数据有效性标志
  43. // 定位质量标志 描述
  44. // A 数据有效
  45. // V 数据无效
  46. /*8*/char mode; //字符 定位模式(备注[2]),仅 NMEA 2.3 及以上版本有效
  47. // 备注[2]定位模式标志
  48. // 定位模式标志 描述
  49. // A 自主模式
  50. // E 估算模式(航位推算)
  51. // N 数据无效
  52. // D 差分模式
  53. // M 未定位,但存在外部输入或历史保存的位置
  54. /*9*/int CS; //校验和,$和*之间(不包括$和*)所有字符的异或结果
  55. }GPGLL_Struct_ts;
  56. typedef struct
  57. {
  58. /*1*/char ID[5]; //消息 ID,GGA 语句头,’--‘为系统标识
  59. /*2*/float cogt; //数值 对地真北航向,单位为度
  60. /*3*/char T; //字符 真北指示,固定为 T
  61. /*4*/float cogm; // 数值 对地磁北航向,单位为度
  62. /*5*/char M; //字符 磁北指示,固定为 M
  63. /*6*/float sog; // 数值 对地速度,单位为节
  64. /*7*/char N; //字符 速度单位节,固定为 N
  65. /*8*/float kph; // 数值 对地速度,单位为千米每小时
  66. /*9*/char K; //字符 速度单位,千米每小时,固定为K
  67. /*10*/char mode; // 字符 定位模式标志(备注[1])仅 NMEA 2.3 及以上版本有效
  68. // 备注[1]定位模式标志
  69. // 定位模式标志 描述
  70. // A 自主模式
  71. // E 估算模式(航位推算)
  72. // N 数据无效
  73. // D 差分模式
  74. // M 未定位,但存在外部输入或历史保存的位置
  75. /*11*/int CS; //校验和,$和*之间(不包括$和*)所有字符的异或结果
  76. }GPVTG_Struct_ts;
  77. typedef struct
  78. {
  79. /*1*/char ID[5]; //消息 ID,GGA 语句头,’--‘为系统标识
  80. /*2*/UTCtimeStruct_ts UTCtime; //hhmmss.sss 定位时的 UTC 时间
  81. /*3*/int day; //数值 日,固定两位数字,取值范围01~31
  82. /*4*/int month; //数值 月,固定两位数字,取值范围01~12
  83. /*5*/int year; //数值 年,固定四位数字
  84. /*6*/int ltzh; //数值 本时区小时,不支持,固定为00
  85. /*7*/int ltzn; //数值 本时区分钟,不支持,固定为00
  86. /*8*/int CS; //校验和,$和*之间(不包括$和*)所有字符的异或结果
  87. }GPZDA_Struct_ts;
  88. typedef struct
  89. {
  90. /*1*/char ID[5]; //消息 ID,GGA 语句头,’--‘为系统标识
  91. /*2*/UTCtimeStruct_ts UTCtime; //hhmmss.sss 当前时刻的 UTC 时间
  92. /*3*/float speed3D; //数值 接收机三维速度,单位为 m/s
  93. /*4*/float spdX; //数值 接收机 ECEF-X 轴方向速度,单位为m/s
  94. /*5*/float spdY; //数值 接收机 ECEF-Y 轴方向速度,单位为m/s
  95. /*6*/float spdZ; //数值 接收机 ECEF-Z 轴方向速度,单位为m/s
  96. /*7*/float gdspd; //数值 接收机水平地面方向速度,单位为m/s
  97. /*8*/int CS; //校验和,$和*之间(不包括$和*)所有字符的异或结果
  98. }GNDHV_Struct_ts;
  99. typedef struct __AT_COMMAND_STRUCT
  100. {
  101. // uint16_t index; //命令在列表中的序号
  102. char *sscanFmt; //
  103. char *printfFmt; //
  104. char *cmdHead; //
  105. char *cmdInfor; //命令注释说明
  106. }gnssStruct_ts;
  107. gnssStruct_ts gnssStructList[] =
  108. {
  109. {
  110. .cmdHead = "$GPGGA",
  111. // 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  112. .sscanFmt = "$%5s,%2d%2d%2d.%3d,%f,%c,%f,%c,%d,%2d,%f,%f,%c,%f,%c,%d,%d*%X\r\n",
  113. .printfFmt = "ID = %s,\nUTCtime : hh:%d mm:%d ss:%d .sss:%03d,\nlat = %.4f,\nuLat = %c,\nlon = %.4f,\nuLon = %c,\nFS = %d,\nnumSv = %02d,\nHDOP = %f,\nmsl = %f,\nuMsl = %c,\nsep = %f,\nuSep = %c,\ndiffAge = %d,\ndiffSta = %d,\nCS = %d\n",
  114. .cmdInfor = "接收机时间、位置及定位相关的数据",
  115. },
  116. {
  117. .cmdHead = "$GPGLL",
  118. // 1 2 3 4 5 [ 6 ] 7 8 9
  119. .sscanFmt = "$%5s,%f,%c,%f,%c,%2d%2d%2d.%3d,%c,%c*%X\r\n",
  120. .printfFmt = "ID = %s,\nlat = %.4f,\nuLat = %c,\nlon = %.4f,\nuLon = %c,\nUTCtime : hh:%d mm:%d ss:%d .sss:%03d,\nvalid = %c,\nmode = %c,\nCS = %d\n",
  121. .cmdInfor = "纬度、经度、定位时间与定位状态等信息",
  122. },
  123. {
  124. .cmdHead = "$GPVTG",
  125. // "$GPVTG,75.20,T,0.1,M,0.009,N,0.017,K,A*02"
  126. // 1 2 3 4 5 6 7 8 9 10 11
  127. .sscanFmt = "$%5s,%f,%c,%[^,],%c,%f,%c,%f,%c,%c*%X\r\n",
  128. .printfFmt = "ID = %s,\ncogt = %f,\nT = %c,\ncogm = %f,\nM = %c,\nsog = %f,\nN = %c,\nkph = %f,\nK = %c,\nmode = %c,\nCS = %d\n",
  129. .cmdInfor = "对地速度与对地航向信息",
  130. },
  131. {
  132. .cmdHead = "$GPZDA",
  133. // 1 [ 2 ] 3 4 5 6 7 8
  134. .sscanFmt = "$%5s,%2d%2d%2d.%3d,%d,%d,%d,%d,%d*%X\r\n",
  135. .printfFmt = "ID = %s,\nUTCtime : hh:%d mm:%d ss:%d .sss:%03d,\nday = %02d,\nmonth = %02d,\nyear = %04d,\nltzh = %02d,\nltzn = %02d,\nCS = %d\n",
  136. .cmdInfor = "时间与日期信息",
  137. },
  138. {
  139. .cmdHead = "$GNDHV",
  140. // 1 [ 2 ] 3 4 5 6 7 8
  141. .sscanFmt = "$%5s,%2d%2d%2d.%3d,%f,%f,%f,%f,%f*%X\r\n",
  142. .printfFmt = "ID = %s,\nUTCtime : hh:%d mm:%d ss:%d .sss:%03d,\nspeed3D = %f,\nspdX = %f,\nspdY = %f,\nspdZ = %f,\ngdspd = %f,\nCS = %d\n",
  143. .cmdInfor = "接收机速度的详细信息",
  144. },
  145. };
  146. GPGGA_Struct_ts GPGGA_Struct;
  147. GPGLL_Struct_ts GPGLL_Struct;
  148. GPVTG_Struct_ts GPVTG_Struct;
  149. GPZDA_Struct_ts GPZDA_Struct;
  150. GNDHV_Struct_ts GNDHV_Struct;
  151. char* _strtok(char *s, const char *delim)
  152. {
  153. const char *spanp;
  154. int c, sc;
  155. char *tok;
  156. static char *last;
  157. if (s == NULL && (s = last) == NULL)
  158. {
  159. // printf("no char1000 s == NULL");
  160. return (NULL);
  161. }
  162. /*
  163. * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
  164. * 跳过字符串首部的分隔符
  165. */
  166. int rcount = 0;
  167. cont:
  168. c = *s++;
  169. for (spanp = delim;(sc = *spanp++) != 0; )
  170. {
  171. if (c == sc)
  172. {
  173. s[-1] = 0;
  174. last = s;
  175. return (NULL);
  176. // goto cont;
  177. }
  178. }
  179. /*
  180. *分割符后面没有字符串了
  181. */
  182. if (c == 0)
  183. { /* no non-delimiter characters */
  184. last = NULL;
  185. // printf("no char1000");
  186. return (NULL);
  187. }
  188. tok = s - 1;/*分割符后面还有字符串,将tok指向字符串首部(不包括分隔符)*/
  189. /*
  190. * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
  191. * Note that delim must have one NUL;we stop if we see that, too.
  192. * 循环字符串中的字符,直到找到分隔符或者结束符,并替换成结束符
  193. */
  194. rcount = 0;
  195. for(;;)
  196. {
  197. c = *s++;
  198. spanp = delim;
  199. /*
  200. *判断字符串中的某字符是不是分割符中的字符
  201. *若是是,将分隔符替换成结束符并返回tok;
  202. *若是不是,继续判断下一个字符
  203. */
  204. do {
  205. if ((sc = *spanp++) == c)
  206. {
  207. if (c == 0)
  208. {
  209. s = NULL;
  210. }
  211. else
  212. {
  213. s[-1] = 0;
  214. }
  215. last = s;
  216. return (tok);
  217. }
  218. // if(rcount ++ > 100)
  219. // {
  220. // printf("no char1000");
  221. // break;
  222. // }
  223. } while (sc != 0);
  224. }
  225. /* NOTREACHED */
  226. return NULL;
  227. }
  228. char* mystrtok(char *s, const char *delim)
  229. {
  230. const char *spanp;
  231. int c, sc;
  232. char *tok;
  233. static char *last;
  234. if (s == NULL && (s = last) == NULL)
  235. {
  236. printf("no char1000 s == NULL");
  237. return (NULL);
  238. }
  239. /*
  240. * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
  241. * 跳过字符串首部的分隔符
  242. */
  243. int rcount = 0;
  244. cont:
  245. c = *s++;
  246. for (spanp = delim;(sc = *spanp++) != 0; )
  247. {
  248. if(rcount ++ > 100)
  249. {
  250. printf("no char1000");
  251. break;
  252. }
  253. if (c == sc)
  254. goto cont;
  255. }
  256. /*
  257. *分割符后面没有字符串了
  258. */
  259. if (c == 0)
  260. { /* no non-delimiter characters */
  261. last = NULL;
  262. printf("no char1000");
  263. return (NULL);
  264. }
  265. tok = s - 1;/*分割符后面还有字符串,将tok指向字符串首部(不包括分隔符)*/
  266. /*
  267. * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
  268. * Note that delim must have one NUL;we stop if we see that, too.
  269. * 循环字符串中的字符,直到找到分隔符或者结束符,并替换成结束符
  270. */
  271. rcount = 0;
  272. for(;;)
  273. {
  274. c = *s++;
  275. spanp = delim;
  276. /*
  277. *判断字符串中的某字符是不是分割符中的字符
  278. *若是是,将分隔符替换成结束符并返回tok;
  279. *若是不是,继续判断下一个字符
  280. */
  281. do {
  282. if ((sc = *spanp++) == c)
  283. {
  284. if (c == 0)
  285. {
  286. s = NULL;
  287. printf("no s = NULL\n");
  288. }
  289. else
  290. {
  291. if(s != NULL)
  292. s[-1] = 0;
  293. else
  294. return NULL;
  295. }
  296. printf("no char %d %d\n", last, s);
  297. last = s;
  298. return (tok);
  299. }
  300. if(rcount ++ > 100)
  301. {
  302. printf("no char1000");
  303. break;
  304. }
  305. } while (sc != 0);
  306. }
  307. printf("no char");
  308. /* NOTREACHED */
  309. return NULL;
  310. }
  311. void GPGGA_sscanf(char *src)
  312. {
  313. char str[255];
  314. const char s[2] = ",";
  315. char *token;
  316. char *replaceAddr;
  317. int count = 0;
  318. memset(str, 0, sizeof(str));
  319. memcpy(str, src, strlen(src));
  320. replaceAddr = strstr(str, "*");
  321. if (replaceAddr)
  322. {
  323. *replaceAddr = ',';
  324. }
  325. printf(str);
  326. /* 获取第一个子字符串 */
  327. token = _strtok(str, s);
  328. /* 继续获取其他的子字符串 */
  329. while(count <= 15) {
  330. // printf( "token = %s ,count=%d\n", token,count );
  331. if(token != NULL)
  332. {
  333. switch(count)
  334. {
  335. case 0:
  336. {
  337. sscanf(token, "$%5s", GPGGA_Struct.ID);
  338. }break;
  339. case 1:
  340. {
  341. sscanf(token, "%2d%2d%2d.%3d", &GPGGA_Struct.UTCtime.hh,&GPGGA_Struct.UTCtime.mm,&GPGGA_Struct.UTCtime.ss,&GPGGA_Struct.UTCtime.sss);
  342. }break;
  343. case 2:
  344. {
  345. sscanf(token, "%f", &GPGGA_Struct.lat);
  346. }break;
  347. case 3:
  348. {
  349. sscanf(token, "%c", &GPGGA_Struct.uLat);
  350. }break;
  351. case 4:
  352. {
  353. sscanf(token, "%f", &GPGGA_Struct.lon);
  354. }break;
  355. case 5:
  356. {
  357. sscanf(token, "%c", &GPGGA_Struct.uLon);
  358. }break;
  359. case 6:
  360. {
  361. sscanf(token, "%d", &GPGGA_Struct.FS);
  362. }break;
  363. case 7:
  364. {
  365. sscanf(token, "%d", &GPGGA_Struct.numSv);
  366. }break;
  367. case 8:
  368. {
  369. sscanf(token, "%f", &GPGGA_Struct.HDOP);
  370. }break;
  371. case 9:
  372. {
  373. sscanf(token, "%f", &GPGGA_Struct.msl);
  374. }break;
  375. case 10:
  376. {
  377. sscanf(token, "%c", &GPGGA_Struct.uMsl);
  378. }break;
  379. case 11:
  380. {
  381. sscanf(token, "%f", &GPGGA_Struct.sep);
  382. }break;
  383. case 12:
  384. {
  385. sscanf(token, "%c", &GPGGA_Struct.uSep);
  386. }break;
  387. case 13:
  388. {
  389. sscanf(token, "%d", &GPGGA_Struct.diffAge);
  390. }break;
  391. case 14:
  392. {
  393. sscanf(token, "%d", &GPGGA_Struct.diffSta);
  394. }break;
  395. case 15:
  396. {
  397. sscanf(token, "%X", &GPGGA_Struct.CS);
  398. }break;
  399. default:
  400. break;
  401. }
  402. }
  403. token = _strtok(NULL, s);
  404. count ++;
  405. }
  406. }
  407. void GPGLL_sscanf(char *src)
  408. {
  409. char str[255];
  410. const char s[2] = ",";
  411. char *token;
  412. char *replaceAddr;
  413. int count = 0;
  414. memset(str, 0, sizeof(str));
  415. memcpy(str, src, strlen(src));
  416. replaceAddr = strstr(str, "*");
  417. if (replaceAddr)
  418. {
  419. *replaceAddr = ',';
  420. }
  421. printf(str);
  422. /* 获取第一个子字符串 */
  423. token = _strtok(str, s);
  424. /* 继续获取其他的子字符串 */
  425. while(count <= 8) {
  426. // printf( "token = %s ,count=%d\n", token,count );
  427. if(token != NULL)
  428. {
  429. switch(count)
  430. {
  431. case 0:
  432. {
  433. sscanf(token, "$%5s", GPGLL_Struct.ID);
  434. }break;
  435. case 1:
  436. {
  437. sscanf(token, "%f", &GPGLL_Struct.lat);
  438. }break;
  439. case 2:
  440. {
  441. sscanf(token, "%c", &GPGLL_Struct.uLat);
  442. }break;
  443. case 3:
  444. {
  445. sscanf(token, "%f", &GPGLL_Struct.lon);
  446. }break;
  447. case 4:
  448. {
  449. sscanf(token, "%c", &GPGLL_Struct.uLon);
  450. }break;
  451. case 5:
  452. {
  453. sscanf(token, "%2d%2d%2d.%3d", &GPGLL_Struct.UTCtime.hh,&GPGLL_Struct.UTCtime.mm,&GPGLL_Struct.UTCtime.ss,&GPGLL_Struct.UTCtime.sss);
  454. }break;
  455. case 6:
  456. {
  457. sscanf(token, "%c", &GPGLL_Struct.valid);
  458. }break;
  459. case 7:
  460. {
  461. sscanf(token, "%c", &GPGLL_Struct.mode);
  462. }break;
  463. case 8:
  464. {
  465. sscanf(token, "%X", &GPGLL_Struct.CS);
  466. }break;
  467. default:
  468. break;
  469. }
  470. }
  471. token = _strtok(NULL, s);
  472. count ++;
  473. }
  474. }
  475. void GPVTG_sscanf(char *src)
  476. {
  477. char str[255];
  478. const char s[2] = ",";
  479. char *token;
  480. char *replaceAddr;
  481. int count = 0;
  482. memset(str, 0, sizeof(str));
  483. memcpy(str, src, strlen(src));
  484. replaceAddr = strstr(str, "*");
  485. if (replaceAddr)
  486. {
  487. *replaceAddr = ',';
  488. }
  489. printf(str);
  490. /* 获取第一个子字符串 */
  491. token = _strtok(str, s);
  492. /* 继续获取其他的子字符串 */
  493. while(count <= 10) {
  494. // printf( "token = %s ,count=%d\n", token,count );
  495. if(token != NULL)
  496. {
  497. switch(count)
  498. {
  499. case 0:
  500. {
  501. sscanf(token, "$%5s", GPVTG_Struct.ID);
  502. }break;
  503. case 1:
  504. {
  505. sscanf(token, "%f", &GPVTG_Struct.cogt);
  506. }break;
  507. case 2:
  508. {
  509. sscanf(token, "%c", &GPVTG_Struct.T);
  510. }break;
  511. case 3:
  512. {
  513. sscanf(token, "%f", &GPVTG_Struct.cogm);
  514. }break;
  515. case 4:
  516. {
  517. sscanf(token, "%c", &GPVTG_Struct.M);
  518. }break;
  519. case 5:
  520. {
  521. sscanf(token, "%f", &GPVTG_Struct.sog);
  522. }break;
  523. case 6:
  524. {
  525. sscanf(token, "%c", &GPVTG_Struct.N);
  526. }break;
  527. case 7:
  528. {
  529. sscanf(token, "%f", &GPVTG_Struct.kph);
  530. }break;
  531. case 8:
  532. {
  533. sscanf(token, "%c", &GPVTG_Struct.K);
  534. }break;
  535. case 9:
  536. {
  537. sscanf(token, "%c", &GPVTG_Struct.mode);
  538. }break;
  539. case 10:
  540. {
  541. sscanf(token, "%X", &GPVTG_Struct.CS);
  542. }break;
  543. default:
  544. break;
  545. }
  546. }
  547. token = _strtok(NULL, s);
  548. count ++;
  549. }
  550. }
  551. void GPZDA_sscanf(char *src)
  552. {
  553. char str[255];
  554. const char s[2] = ",";
  555. char *token;
  556. char *replaceAddr;
  557. int count = 0;
  558. memset(str, 0, sizeof(str));
  559. memcpy(str, src, strlen(src));
  560. replaceAddr = strstr(str, "*");
  561. if (replaceAddr)
  562. {
  563. *replaceAddr = ',';
  564. }
  565. printf(str);
  566. /* 获取第一个子字符串 */
  567. token = _strtok(str, s);
  568. /* 继续获取其他的子字符串 */
  569. while(count <= 7) {
  570. // printf( "token = %s ,count=%d\n", token,count );
  571. if(token != NULL)
  572. {
  573. switch(count)
  574. {
  575. case 0:
  576. {
  577. sscanf(token, "$%5s", GPZDA_Struct.ID);
  578. }break;
  579. case 1:
  580. {
  581. sscanf(token, "%2d%2d%2d.%3d", &GPZDA_Struct.UTCtime.hh,&GPZDA_Struct.UTCtime.mm,&GPZDA_Struct.UTCtime.ss,&GPZDA_Struct.UTCtime.sss);
  582. }break;
  583. case 2:
  584. {
  585. sscanf(token, "%d", &GPZDA_Struct.day);
  586. }break;
  587. case 3:
  588. {
  589. sscanf(token, "%d", &GPZDA_Struct.month);
  590. }break;
  591. case 4:
  592. {
  593. sscanf(token, "%d", &GPZDA_Struct.year);
  594. }break;
  595. case 5:
  596. {
  597. sscanf(token, "%d", &GPZDA_Struct.ltzh);
  598. }break;
  599. case 6:
  600. {
  601. sscanf(token, "%d", &GPZDA_Struct.ltzn);
  602. }break;
  603. case 7:
  604. {
  605. sscanf(token, "%X", &GPZDA_Struct.CS);
  606. }break;
  607. default:
  608. break;
  609. }
  610. }
  611. token = _strtok(NULL, s);
  612. count ++;
  613. }
  614. }
  615. void GNDHV_sscanf(char *src)
  616. {
  617. char str[255];
  618. const char s[2] = ",";
  619. char *token;
  620. char *replaceAddr;
  621. int count = 0;
  622. memset(str, 0, sizeof(str));
  623. memcpy(str, src, strlen(src));
  624. replaceAddr = strstr(str, "*");
  625. if (replaceAddr)
  626. {
  627. *replaceAddr = ',';
  628. }
  629. printf(str);
  630. /* 获取第一个子字符串 */
  631. token = _strtok(str, s);
  632. /* 继续获取其他的子字符串 */
  633. while(count <= 7) {
  634. // printf( "token = %s ,count=%d\n", token,count );
  635. if(token != NULL)
  636. {
  637. switch(count)
  638. {
  639. case 0:
  640. {
  641. sscanf(token, "$%5s", GNDHV_Struct.ID);
  642. }break;
  643. case 1:
  644. {
  645. sscanf(token, "%2d%2d%2d.%3d", &GNDHV_Struct.UTCtime.hh,&GNDHV_Struct.UTCtime.mm,&GNDHV_Struct.UTCtime.ss,&GNDHV_Struct.UTCtime.sss);
  646. }break;
  647. case 2:
  648. {
  649. sscanf(token, "%f", &GNDHV_Struct.speed3D);
  650. }break;
  651. case 3:
  652. {
  653. sscanf(token, "%f", &GNDHV_Struct.spdX);
  654. }break;
  655. case 4:
  656. {
  657. sscanf(token, "%f", &GNDHV_Struct.spdY);
  658. }break;
  659. case 5:
  660. {
  661. sscanf(token, "%f", &GNDHV_Struct.spdZ);
  662. }break;
  663. case 6:
  664. {
  665. sscanf(token, "%f", &GNDHV_Struct.gdspd);
  666. }break;
  667. case 7:
  668. {
  669. sscanf(token, "%X", &GNDHV_Struct.CS);
  670. }break;
  671. default:
  672. break;
  673. }
  674. }
  675. token = _strtok(NULL, s);
  676. count ++;
  677. }
  678. }
  679. void decodeGnss(char *src)
  680. {
  681. if (strstr(src, "$GPGGA"))
  682. {
  683. GPGGA_sscanf(src);
  684. // GPGGA_sscanf("$GPGGA,235316.000,2959.9925,S,12000.0090,E,1,06,1.21,62.77,,0.00,M,,0*7B");
  685. printf(gnssStructList[0].printfFmt,
  686. GPGGA_Struct.ID,
  687. GPGGA_Struct.UTCtime.hh,GPGGA_Struct.UTCtime.mm,GPGGA_Struct.UTCtime.ss,GPGGA_Struct.UTCtime.sss,
  688. GPGGA_Struct.lat,
  689. GPGGA_Struct.uLat,
  690. GPGGA_Struct.lon,
  691. GPGGA_Struct.uLon,
  692. GPGGA_Struct.FS,
  693. GPGGA_Struct.numSv,
  694. GPGGA_Struct.HDOP,
  695. GPGGA_Struct.msl,
  696. GPGGA_Struct.uMsl,
  697. GPGGA_Struct.sep,
  698. GPGGA_Struct.uSep,
  699. GPGGA_Struct.diffAge,
  700. GPGGA_Struct.diffSta,
  701. GPGGA_Struct.CS
  702. );
  703. }
  704. if (strstr(src, "$GPGLL"))
  705. {
  706. printf("-------------%d\n");
  707. GPGLL_sscanf(src);
  708. // GPGLL_sscanf("$GPGLL,2959.9925,A,12000.0090,E,235316.000,A,A*4E");
  709. printf(gnssStructList[1].printfFmt,
  710. GPGLL_Struct.ID,
  711. GPGLL_Struct.lat,
  712. GPGLL_Struct.uLat,
  713. GPGLL_Struct.lon,
  714. GPGLL_Struct.uLon,
  715. GPGLL_Struct.UTCtime.hh,GPGLL_Struct.UTCtime.mm,GPGLL_Struct.UTCtime.ss,GPGLL_Struct.UTCtime.sss,
  716. GPGLL_Struct.valid,
  717. GPGLL_Struct.mode,
  718. GPGLL_Struct.CS
  719. );
  720. }
  721. if (strstr(src, "$GPVTG"))
  722. {
  723. printf("-------------\n");
  724. GPVTG_sscanf(src);
  725. // GPVTG_sscanf("$GPVTG,75.20,T,,M,0.009,N,0.017,K,A*02");
  726. printf(gnssStructList[2].printfFmt,
  727. GPVTG_Struct.ID,
  728. GPVTG_Struct.cogt,
  729. GPVTG_Struct.T,
  730. GPVTG_Struct.cogm,
  731. GPVTG_Struct.M,
  732. GPVTG_Struct.sog,
  733. GPVTG_Struct.N,
  734. GPVTG_Struct.kph,
  735. GPVTG_Struct.K,
  736. GPVTG_Struct.mode,
  737. GPVTG_Struct.CS
  738. );
  739. }
  740. if (strstr(src, "$GPZDA"))
  741. {
  742. printf("-------------\n");
  743. GPZDA_sscanf(src);
  744. // GPZDA_sscanf("$GPZDA,235316.000,02,07,2011,00,00*51");
  745. printf(gnssStructList[3].printfFmt,
  746. GPZDA_Struct.ID,
  747. GPZDA_Struct.UTCtime.hh,GPZDA_Struct.UTCtime.mm,GPZDA_Struct.UTCtime.ss,GPZDA_Struct.UTCtime.sss,
  748. GPZDA_Struct.day,
  749. GPZDA_Struct.month,
  750. GPZDA_Struct.year,
  751. GPZDA_Struct.ltzh,
  752. GPZDA_Struct.ltzn,
  753. GPZDA_Struct.CS
  754. );
  755. }
  756. if (strstr(src, "$GNDHV"))
  757. {
  758. printf("-------------\n");
  759. GNDHV_sscanf(src);
  760. // GNDHV_sscanf("$GNDHV,021150.000,0.03,0.006,-0.042,-0.026,0.06*65");
  761. printf(gnssStructList[4].printfFmt,
  762. GNDHV_Struct.ID,
  763. GNDHV_Struct.UTCtime.hh,GNDHV_Struct.UTCtime.mm,GNDHV_Struct.UTCtime.ss,GNDHV_Struct.UTCtime.sss,
  764. GNDHV_Struct.speed3D,
  765. GNDHV_Struct.spdX,
  766. GNDHV_Struct.spdY,
  767. GNDHV_Struct.spdZ,
  768. GNDHV_Struct.gdspd,
  769. GNDHV_Struct.CS
  770. );
  771. }
  772. }