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

定义OnComm函数如下,接收字符数据即开始执行,判断为哪什么数据,若是GPGGA的信息将会显示在接收文本框中。
界面图片
  1. /*------------------------------------------------------ 
  2.  * OnComm函数实现 
  3.  * 触发条件:当输入缓冲区有字符时,有消息触发 
  4.  * 执行结果:字符接收,并显示在文本框m_strEditReceiveMsg 
  5.  *------------------------------------------------------*/ 
  6. #define CR 0x0D //定义回车
  7. #define LF 0x0A //定义换行
  8. LONG CReadGPSView::OnComm(WPARAM ch, LPARAM port) 
  9. {
  10.     /*------------------------------------------------------
  11.      * 声明变量:静态变量连续接收字符并保存
  12.      *           普通变量
  13.      *------------------------------------------------------*/
  14.     static char checkSum = 0;//异或交验
  15.     static int count = 0;
  16.     static unsigned char buf[20];
  17.     static char chigh,clow;//用于交验,计算半
  18.     static int flag = -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.     case CR:
  97.         break;
  98.     case LF:
  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.                 CString check="";
  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.                 CString strTemp;
  138.                 strTemp = m_strPortRxData.Mid(7,6);
  139.                 char *temp = (char*) ((LPCTSTR)strTemp);
  140.                 char tbuf[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.                 
  152.                 strTemp = m_strPortRxData.Mid(18,27);
  153.                 temp = (char*) ((LPCTSTR)strTemp);
  154.                 
  155.                 tbuf[0]=temp[0];
  156.                 tbuf[1]=temp[1];
  157.                 tbuf[2]='^';
  158.                 tbuf[3]=temp[2];
  159.                 tbuf[4]=temp[3];
  160.                 tbuf[5]='-';
  161.                 tbuf[6]=temp[4];
  162.                 tbuf[7]=temp[5];
  163.                 tbuf[8]='"';
  164.                 tbuf[9]=0;
  165.                 /*----------------------------------------------------
  166.                  * 数据存储
  167.                  *---------------------------------------------------*/
  168.                 if (!m_pSet->IsEOF())
  169.                     m_pSet->MoveLast();
  170.                 m_pSet->AddNew();
  171.                 UpdateData(FALSE);
  172.                 m_pSet->m_WDZ = atof(strTemp);
  173.                 UpdateData(FALSE);
  174.                 if( m_pSet->CanUpdate())
  175.                 {
  176.                     if(!m_pSet->Update())
  177.                         AfxMessageBox(_T("添加记录失败!"));
  178.                     else
  179.                         AfxMessageBox(_T("成功添加一条记录!"));
  180.                 }
  181.                 else
  182.                 {
  183.                     AfxMessageBox(_T("不能添加记录!"));
  184.                 }
  185.                     m_strEditRX = m_strPortRxData;//接收字符 
  186.                     UpdateData(FALSE);  //将接收到的字符显示在接收编辑框中 
  187.                     return 0;
  188.                     ;
  189.                 //}
  190.             }
  191.             else
  192.             {
  193.                 if ( flag == 5 )//标志 已经接收到 GPGGA 协议包头名称'GPGGA'
  194.                 {
  195.                     m_strPortRxData += ch;//接受字符
  196.                     
  197.                     checkSum ^= ch;//计算交验值
  198.                     //if (  )
  199.                 }
  200.                 else
  201.                     break;
  202.             }
  203.         break;
  204.     }
  205.     return 0;
  206. }

 

 

 

posted @ 2008-12-08 15:11  涛涌四海  阅读(398)  评论(0编辑  收藏  举报