如何截取GPS接收机的GPGGA通信协议数据
答案:1 悬赏:0 手机版
解决时间 2021-02-07 22:04
- 提问者网友:niaiwoma
- 2021-02-07 07:01
如何截取GPS接收机的GPGGA通信协议数据
最佳答案
- 五星知识达人网友:十鸦
- 2021-02-07 07:23
#define CR 0x0D //定义回车 #define LF 0x0A //定义换行 LONG CReadGPSView::OnComm(WPARAM ch, LPARAM port) { static char checkSum = 0;//异或交验 static int count = 0; static unsigned char buf[20]; static char chigh,clow;//用于交验,计算半 static int flag = -1;//用于标记“接收阶段” switch(ch) { //包首 case '$': checkSum = 0;//开始计算checksum交验值 flag = 0; m_strPortRxData.Empty(); m_strPortRxData += ch;//接受字符 break; //包尾 case '*': if ( flag ==5 ) { flag = 16; m_strPortRxData += ch;//接受字符 clow = checkSum & 0x0F;//接收交验码低四位 chigh = ( checkSum >> 4 ) & 0x0F;//接收交验码高四位 //计算校验码转化后的字符。 if ( clow < 10 ) clow = '0' + clow; else clow = 'A' + ( clow - 10 ); if ( chigh < 10 ) chigh = '0' + chigh; else chigh = 'A' + ( chigh - 10 ); } break; //包名"GPGGA"检测,连续接受GPGGA后,flag值为5; case 'G': if (flag == 0)//标志 上一次接受字符为 '$',(这是第一个'G'字符) { flag = 1; m_strPortRxData += ch;//接受字符 } else { if (flag == 2)//标志 上一次接受字符为 'P',(这是第二个'G'字符) { flag = 3; m_strPortRxData += ch;//接受字符 } else { if ( flag == 3)//标志 上一次接受字符为第二个 'G',(这是第三个'G'字符) { flag = 4; m_strPortRxData += ch;//接受字符 } else flag = -1; } } break; case 'P': if (flag == 1)//标志 上一次接受字符为第一个 'G',(这是'P'字符) { flag = 2; m_strPortRxData += ch;//接受字符 } else flag = -1; break; case 'A': if (flag == 4)//标志 上一次接受字符为第三个 'G',(这是'A'字符) { flag = 5; m_strPortRxData += ch;//接受字符 } else flag = -1; break; case CR: break; case LF: m_strPortRxData.Empty(); break; default: //处理接收校验码 if ( flag == 16 )//标志 已经接收到 GPGGA 协议包尾'*' { flag--; m_strPortRxCheck += ch; m_strPortRxData += ch; } else //以下程序段在接收,判断校验码是否正确 if ( flag == 15 )//标志 已经接收到 GPGGA 协议包校验码 { CString check=""; check.Format("%c%c",chigh,clow); m_strPortRxData += ch; m_strPortRxData += CR; m_strPortRxData += LF; CString strTemp; strTemp = m_strPortRxData.Mid(7,6); char *temp = (char*) ((LPCTSTR)strTemp); char tbuf[10]; tbuf[0]=temp[0]; tbuf[1]=temp[1]; tbuf[2]=':'; tbuf[3]=temp[2]; tbuf[4]=temp[3]; tbuf[5]=':'; tbuf[6]=temp[4]; tbuf[7]=temp[5]; tbuf[8]=0; m_Time = tbuf; strTemp = m_strPortRxData.Mid(18,27); temp = (char*) ((LPCTSTR)strTemp); tbuf[0]=temp[0]; tbuf[1]=temp[1]; tbuf[2]='^'; tbuf[3]=temp[2]; tbuf[4]=temp[3]; tbuf[5]='-'; tbuf[6]=temp[4]; tbuf[7]=temp[5]; tbuf[8]='"'; tbuf[9]=0; if (!m_pSet->IsEOF()) m_pSet->MoveLast(); m_pSet->AddNew(); UpdateData(FALSE); m_pSet->m_WDZ = atof(strTemp); UpdateData(FALSE); if( m_pSet->CanUpdate()) { if(!m_pSet->Update()) AfxMessageBox(_T("添加记录失败!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯