永发信息网

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

答案:1  悬赏:0  手机版
解决时间 2021-02-07 22:04
如何截取GPS接收机的GPGGA通信协议数据
最佳答案
#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("添加记录失败!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
打烊(yang)是第几声?
室外温度零下八度换朔钢窗缝抹水泥可以取吗?
向君堂大药房地址在哪,我要去那里办事
老场小学(淮安淮阴区)怎么去啊,我要去那办事
烟台23路公交路线全程要多久
一加一广告在哪里啊,我有事要去这个地方
泗河小学(淮安淮阴区)地址在哪,我要去那里办
摩托车开这风门跑得动,关这就跑不动了还息火
今年属鸡的是什么命2017阴历2月27出生时间10
温度太低了,奥迪q5点不着火,第二次点着了。
浪石小学(淮安淮阴区)地址有知道的么?有点事
成都本草堂药品连锁有限公司飞诚药房我想知道
电蒸箱什么品牌好?方太电蒸箱SCD26-D2和SCD2
现在还是冬天吧?什么时候算是到春天了?就是
高堰小学(淮安淮阴区)怎么去啊,我要去那办事
推荐资讯
表示一句话含两种(或多种)意思的成语?急
春香日租房地址在什么地方,我要处理点事
空调新机怎么加冷媒
高渗糖为什么不宜作急性脑血管病的脱水剂?
志强物流(分店)地址在什么地方,我要处理点事
恒功率变量柱塞泵功率小于1.85MPa 排量大于40
【电器着火怎么办】家用电器着火了怎么办的作
患者,男性,63岁。近半年来常有不明原因的低
长得像白极熊一样的狗,叫什么狗
学生参加体操表演进行分组.按每组8人或每组10
qq空间直播怎么搞动画的兔子之类的
不再让你孤单 弹吉他时右手的按法怎么按?532
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?