鱼C论坛

 找回密码
 立即注册
查看: 2087|回复: 9

大神帮忙看下GPS数据包如何循环解析

[复制链接]
发表于 2019-7-24 14:50:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大神帮忙看下如何实现遍历所有编辑框的中数据,实现循环解析GPS的数据!以下代码仅能实现一行数据的解析!
数据源:
$GPRMC,014254.70,A,2603.613111,N,11910.693806,E,0.364,273.16,230719,,,A*69
$GPGGA,014254.70,2603.613111,N,11910.693806,E,1,12,1.13,4.50,M,9.90,M,,*64
$GPRMC,014254.80,A,2603.613113,N,11910.693794,E,0.370,272.77,230719,,,A*63
$GPGGA,014254.80,2603.613113,N,11910.693794,E,1,12,1.13,4.50,M,9.90,M,,*6D
$GPRMC,014254.90,A,2603.613115,N,11910.693792,E,0.368,271.60,230719,,,A*6E
$GPGGA,014254.90,2603.613115,N,11910.693792,E,1,12,1.13,4.60,M,9.90,M,,*6F
$GPRMC,014255.00,A,2603.613123,N,11910.693764,E,0.365,273.78,230719,,,A*6C
$GPGGA,014255.00,2603.613123,N,11910.693764,E,1,12,1.13,4.60,M,9.90,M,,*6B

//GPS数据解析
        split split;//切分函数类
        CString buffString;
        int nlinecout1 = (m_EditRev.GetLineCount() - 1);//获取行数
        
        for (int i = 0; i < nlinecout1; i++)
        {
                int len = m_EditRev.LineLength(m_EditRev.LineIndex(i));
                buffString = m_strReceive;//编辑框值变量,原始数据保存在该变量
                split.SetSplitFlag(_T(","));//切分标志
                split.SetSequenceAsOne(TRUE);
                split.SetData(buffString);
                CStringArray array;
                split.GetSplitStrArray(array);//将切分的数据存入数组中
                //判断读取的GPS信息的类型

                if (array[0] = "$GPRMC")
                {
                        m_strJD = array[3].Left(2) + "." + array[3].Mid(2, 2) + array[3].Right(6) ;
                        m_strWD = array[5].Left(3) + "." + array[5].Mid(3, 2) + array[5].Right(6) ;
                }
               
                UpdateData(false);
        }
之前尝试用GetLine()循坏获取EDIT控件中的每一行的内容,但是每一行的正确数据后面总带有乱码!
请大神在代码上指点一下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-24 15:13:07 | 显示全部楼层
什么乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-24 15:41:10 | 显示全部楼层
如果是python 做这个事情 就很容易的

>>> lst=[x.split(",") for x in s.split("\n")]
>>> lst
[['$GPRMC', '014254.70', 'A', '2603.613111', 'N', '11910.693806', 'E', '0.364', '273.16', '230719', '', '', 'A*69'], ['$GPGGA', '014254.70', '2603.613111', 'N', '11910.693806', 'E', '1', '12', '1.13', '4.50', 'M', '9.90', 'M', '', '*64'], ['$GPRMC', '014254.80', 'A', '2603.613113', 'N', '11910.693794', 'E', '0.370', '272.77', '230719', '', '', 'A*63'], ['$GPGGA', '014254.80', '2603.613113', 'N', '11910.693794', 'E', '1', '12', '1.13', '4.50', 'M', '9.90', 'M', '', '*6D'], ['$GPRMC', '014254.90', 'A', '2603.613115', 'N', '11910.693792', 'E', '0.368', '271.60', '230719', '', '', 'A*6E'], ['$GPGGA', '014254.90', '2603.613115', 'N', '11910.693792', 'E', '1', '12', '1.13', '4.60', 'M', '9.90', 'M', '', '*6F'], ['$GPRMC', '014255.00', 'A', '2603.613123', 'N', '11910.693764', 'E', '0.365', '273.78', '230719', '', '', 'A*6C'], ['$GPGGA', '014255.00', '2603.613123', 'N', '11910.693764', 'E', '1', '12', '1.13', '4.60', 'M', '9.90', 'M', '', '*6B'], ['']]
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 15:57:01 | 显示全部楼层


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 15:58:16 | 显示全部楼层

后面会出现这样一串乱码
L"$GPRMC,075308.60,A,2603.612225,N,11910.677423,E,0.280,245.95,240719,,,A*61&#52685;&#65021;&#65021;"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 15:59:30 | 显示全部楼层

    我的循环代码是这样写的,辛苦您帮我看下问题出在哪里?   
        split split;
        CString buffString;
        //赋值
        int nlinecout1 = (m_EditRev.GetLineCount() - 1);//获取行数
        CString*strText = new CString[nlinecout1];
       
        for (int i = 0; i < nlinecout1; i++)
        {
                int len = m_EditRev.LineLength(m_EditRev.LineIndex(i));
                buffString==m_EditRev.GetLine(i, strText.GetBuffer(len), len);
                //buffString = m_strReceive;//编辑框值变量,原始数据保存在该变量
                split.SetSplitFlag(_T(","));
                split.SetSequenceAsOne(TRUE);
                split.SetData(buffString);
                CStringArray array;
                split.GetSplitStrArray(array);//数组出现错误

                //判断读取的GPS信息的类型
                if (array[0] = "$GPRMC")//
                {
                        m_strJD = array[3].Left(2) + "." + array[3].Mid(2, 2) + array[3].Right(6) ;
                        m_strWD = array[5].Left(3) + "." + array[5].Mid(3, 2) + array[5].Right(6) ;
                }
                strText.ReleaseBuffer(len);
                UpdateData(false);
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-24 16:18:11 | 显示全部楼层
C++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-24 16:31:51 | 显示全部楼层

每一步都输出一下,看是不是和预想的一样,直接跳到结果太快了,或者你用的编译器也可以单步调试看变化,应该就可以看到哪里出现问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 16:43:51 | 显示全部楼层
joe_mao 发表于 2019-7-24 16:31
每一步都输出一下,看是不是和预想的一样,直接跳到结果太快了,或者你用的编译器也可以单步调试看变化, ...

问题应该出现在:buffString==m_EditRev.GetLine(i, strText.GetBuffer(len), len);通过该句获取内容后,后面会出现乱码:"$GPRMC,075308.60,A,2603.612225,N,11910.677423,E,0.280,245.95,240719,,,A*61&#52685;&#65021;&#65021;"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-24 16:53:53 | 显示全部楼层
然后再检查这个函数调用,看是不是传参数的时候是不是和它需要的是一个意思,比如说len是不是调用说明的那个len还是数长度要加一,buffer够不够等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 15:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表