如何截取GPS接收机的GPGGA通信协议数据

定义OnComm函数如下,接收字符数据即开始执行,判断为哪什么数据,若是GPGGA的信息将会显示在接收文本框中。
如何截取GPS接收机的GPGGA通信协议数据
界面图片
  1. /*------------------------------------------------------
  2. *OnComm函数实现
  3. *触发条件:当输入缓冲区有字符时,有消息触发
  4. *执行结果:字符接收,并显示在文本框m_strEditReceiveMsg
  5. *------------------------------------------------------*/
  6. #defineCR0x0D//定义回车
  7. #defineLF0x0A//定义换行
  8. LONGCReadGPSView::OnComm(WPARAMch,LPARAMport)
  9. {
  10. /*------------------------------------------------------
  11. *声明变量:静态变量连续接收字符并保存
  12. *普通变量
  13. *------------------------------------------------------*/
  14. staticcharcheckSum=0;//异或交验
  15. staticintcount=0;
  16. staticunsignedcharbuf[20];
  17. staticcharchigh,clow;//用于交验,计算半
  18. staticintflag=-1;//用于标记“接收阶段”
  19. /*------------------------------------------------------
  20. *判断接受信息(只接收GPGGA信息)
  21. *$GPGGA,135105.000,3605.1204,N,12022.0206,E,1,03,8.5,
  22. *53.0,M,-3.2,M,,0000*7B
  23. *------------------------------------------------------*/
  24. switch(ch)
  25. {
  26. //包首
  27. case'$':
  28. checkSum=0;//开始计算checksum交验值
  29. flag=0;
  30. m_strPortRxData.Empty();
  31. m_strPortRxData+=ch;//接受字符
  32. break;
  33. //包尾
  34. case'*':
  35. if(flag==5)
  36. {
  37. flag=16;
  38. m_strPortRxData+=ch;//接受字符
  39. clow=checkSum&0x0F;//接收交验码低四位
  40. chigh=(checkSum>>4)&0x0F;//接收交验码高四位
  41. //计算校验码转化后的字符。
  42. if(clow<10)
  43. clow='0'+clow;
  44. else
  45. clow='A'+(clow-10);
  46. if(chigh<10)
  47. chigh='0'+chigh;
  48. else
  49. chigh='A'+(chigh-10);
  50. }
  51. break;
  52. //包名"GPGGA"检测,连续接受GPGGA后,flag值为5;
  53. case'G':
  54. if(flag==0)//标志上一次接受字符为'$',(这是第一个'G'字符)
  55. {
  56. flag=1;
  57. m_strPortRxData+=ch;//接受字符
  58. }
  59. else
  60. {
  61. if(flag==2)//标志上一次接受字符为'P',(这是第二个'G'字符)
  62. {
  63. flag=3;
  64. m_strPortRxData+=ch;//接受字符
  65. }
  66. else
  67. {
  68. if(flag==3)//标志上一次接受字符为第二个'G',(这是第三个'G'字符)
  69. {
  70. flag=4;
  71. m_strPortRxData+=ch;//接受字符
  72. }
  73. else
  74. flag=-1;
  75. }
  76. }
  77. break;
  78. case'P':
  79. if(flag==1)//标志上一次接受字符为第一个'G',(这是'P'字符)
  80. {
  81. flag=2;
  82. m_strPortRxData+=ch;//接受字符
  83. }
  84. else
  85. flag=-1;
  86. break;
  87. case'A':
  88. if(flag==4)//标志上一次接受字符为第三个'G',(这是'A'字符)
  89. {
  90. flag=5;
  91. m_strPortRxData+=ch;//接受字符
  92. }
  93. else
  94. flag=-1;
  95. break;
  96. caseCR:
  97. break;
  98. caseLF:
  99. m_strPortRxData.Empty();
  100. break;
  101. /*----------------------------------------------------
  102. *Default部分功能:
  103. *1.接收校验字符(接受到*后,falg=16)
  104. *2.接收校验后(flag=15),判断校验字符是否正确
  105. *3.接收普通字符(接受GPGGA包头名称后)
  106. *4.接收
  107. *算法:
  108. *----------------------------------------------------*/
  109. default:
  110. //处理接收校验码
  111. if(flag==16)//标志已经接收到GPGGA协议包尾'*'
  112. {
  113. flag--;
  114. m_strPortRxCheck+=ch;
  115. m_strPortRxData+=ch;
  116. }
  117. else
  118. //以下程序段在接收,判断校验码是否正确
  119. if(flag==15)//标志已经接收到GPGGA协议包校验码
  120. {
  121. CStringcheck="";
  122. check.Format("%c%c",chigh,clow);
  123. /*
  124. if(check!=m_strPortRxCheck)//校验错
  125. {
  126. AfxMessageBox("校验错");
  127. }
  128. else//校验正确,1.显示数据;2.数据截取处理。
  129. {
  130. */
  131. /*----------------------------------------------------
  132. *显示接受的字符
  133. *----------------------------------------------------*/
  134. m_strPortRxData+=ch;
  135. m_strPortRxData+=CR;
  136. m_strPortRxData+=LF;
  137. CStringstrTemp;
  138. strTemp=m_strPortRxData.Mid(7,6);
  139. char*temp=(char*)((LPCTSTR)strTemp);
  140. chartbuf[10];
  141. tbuf[0]=temp[0];
  142. tbuf[1]=temp[1];
  143. tbuf[2]=':';
  144. tbuf[3]=temp[2];
  145. tbuf[4]=temp[3];
  146. tbuf[5]=':';
  147. tbuf[6]=temp[4];
  148. tbuf[7]=temp[5];
  149. tbuf[8]=0;
  150. m_Time=tbuf;
  151. strTemp=m_strPortRxData.Mid(18,27);
  152. temp=(char*)((LPCTSTR)strTemp);
  153. tbuf[0]=temp[0];
  154. tbuf[1]=temp[1];
  155. tbuf[2]='^';
  156. tbuf[3]=temp[2];
  157. tbuf[4]=temp[3];
  158. tbuf[5]='-';
  159. tbuf[6]=temp[4];
  160. tbuf[7]=temp[5];
  161. tbuf[8]='"';
  162. tbuf[9]=0;
  163. /*----------------------------------------------------
  164. *数据存储
  165. *---------------------------------------------------*/
  166. if(!m_pSet->IsEOF())
  167. m_pSet->MoveLast();
  168. m_pSet->AddNew();
  169. UpdateData(FALSE);
  170. m_pSet->m_WDZ=atof(strTemp);
  171. UpdateData(FALSE);
  172. if(m_pSet->CanUpdate())
  173. {
  174. if(!m_pSet->Update())
  175. AfxMessageBox(_T("添加记录失败!"));
  176. else
  177. AfxMessageBox(_T("成功添加一条记录!"));
  178. }
  179. else
  180. {
  181. AfxMessageBox(_T("不能添加记录!"));
  182. }
  183. m_strEditRX=m_strPortRxData;//接收字符
  184. UpdateData(FALSE);//将接收到的字符显示在接收编辑框中
  185. return0;
  186. ;
  187. //}
  188. }
  189. else
  190. {
  191. if(flag==5)//标志已经接收到GPGGA协议包头名称'GPGGA'
  192. {
  193. m_strPortRxData+=ch;//接受字符
  194. checkSum^=ch;//计算交验值
  195. //if()
  196. }
  197. else
  198. break;
  199. }
  200. break;
  201. }
  202. return0;
  203. }

你可能感兴趣的:(算法)