5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 1223|回复: 12
打印 上一主题 下一主题

求助,官方的congfig文件看不懂啊

[复制链接]
跳转到指定楼层
楼主
发表于 2011-3-15 14:27 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
正在搞手机版的调参软件,遇到对16进制解析问题。虽然有zht9961020同学提供出了他的代码,非常感谢,但我还是搞不定,首先VB的代码和java还是不一样,我转不过来:em25:。其次,我这个既然是调参的就应该基于.xconfig文件,虽然这个文件虽然是标准的xml,但data仍然是16进制,而且和通讯协议上说的不一样,这个真要命啦。例如我现在用的就是:X650 3S X飞行样式默认参数(1.30固件用).xconfig,我要寻找 姿态控制参数 ,所以搜索“0c”发现一串值:0C800A861C80000006666A63F6F12833B0000A040C800A861C8000000000020410AD7233C0000A040C800E803C8000000问题1:0c就是表示开始吗?
问题2:这个到哪算结束呀,难道是根据“字段长度”往后数吗?比如第一的字段“飞行模式”长度是1,是不是就是占一位数字。但看现在的,0c后面紧挨着就是8!,按说明书上的只有1,2,3啊!这个8是啥?可能我一开始就搞错了吧。
总的来说本人虽然也是做程序的,但对16进制一窍不通啊:em25:
各位懂的朋友可一定要再帮帮忙啊。


手机版目前还是半成品:
http://bbs.5imx.com/bbs/viewthread.php?tid=468543

欢迎继续阅读楼主其他信息

13
发表于 2011-3-15 21:37 | 只看该作者
:em26:
12
发表于 2011-3-15 19:21 | 只看该作者
嗯,加油咯
11
 楼主| 发表于 2011-3-15 18:03 | 只看该作者
又见位牛人:em15:
我这个笨人终有开窍了,2位高手看看我这回理解的是不是对啦。
我就是要解析这个:AttitudeControlConfig这个参数中的Data="0304504650467837000....."
第1和2位:字段:飞行模式, 值:3;
第3和4位:字段:飞行模式开关映射, 值:4;
后面的顺序就根据“通讯协议”表格的依次往后排。
字段长度 是1的,我就把连续2位数转成10进制得到值,同理,字段长度 是4的,我就把连续8位数转成10进制.
:em07: 怎样,我是不是弄明白啦:em15:
10
发表于 2011-3-15 17:49 | 只看该作者
好男人就是我,我就是MOMO...:em15:

忘记另外一个账号的账号名和密码,所以用这个号来回答...

结构很简单,zht9961020基本上讲出了重点。

设计的时候,没有考虑给参数加密,采用这种编码纯属方便以XML方式保存内容。

Config标签的Data属性内容其实是对应参数的"纯数据"(有效数据),只不过用字符的形式表示,每2个字符表示1个字节的数据。

例如AttitudeControlConfig这个参数中的Data="0304504650467837000....."

例如首两个字符"03" 就是 字节0x03 (这里加上0x前缀表示十六进制,方便辨识区分)
同理,
"04" -> 0x04
"50" -> 0x50
"46" -> 0x46
如此类推...

顺带一提,对调参软件或通信协议有任何看法或问题,可以发email到xiaoyanqiang@gmail.com与我探讨。
9
发表于 2011-3-15 16:56 | 只看该作者
确实是一样的,直接按照手册里的说明分析就可以,那一长串数据就是有效的通讯数据(不包含同步信号,指令,数据长度和校验和)
.xconfig文件中是16进制的,把每两位转换成10进制就可以了
8
 楼主| 发表于 2011-3-15 16:40 | 只看该作者
:em15: 那你就再研究下啦,反正你做的也能用到xconfig啊:em15:
7
发表于 2011-3-15 16:26 | 只看该作者
刚才看了一下.xconfig文件中的内容,其数据长度倒是和手册里相关参数的长度是一致的,可能数据格式是一样的,别被我误导了,还是找官方确认一下吧:em17:
6
 楼主| 发表于 2011-3-15 16:07 | 只看该作者
原帖由 zht9961020 于 2011-3-15 16:05 发表
那就不知道了,协议手册中的数据格式应该跟.xconfig文件中的不是一回事
谢谢您告诉我这么悲剧的结果:em25:
5
发表于 2011-3-15 16:05 | 只看该作者
那就不知道了,协议手册中的数据格式应该跟.xconfig文件中的不是一回事

我觉得PC调参软件不是这个原理:em04:

[ 本帖最后由 zht9961020 于 2011-3-15 16:07 编辑 ]
4
 楼主| 发表于 2011-3-15 15:58 | 只看该作者
对,我的就是这个意思。不是每次改值都直接去请求飞控的,先在本地建立xml文件,一般都小修改只是作用与这个xml,等用户觉得差不多改完了,在把xml提交给飞控。目前pc端的官方调参也是这个原理吧。所以我才想解析官方的xconfig:em25:

[ 本帖最后由 wnq 于 2011-3-15 16:02 编辑 ]
3
发表于 2011-3-15 15:31 | 只看该作者
有个问题我没整明白,我怎么感觉调参跟.xconfig文件没什么关系呢?


楼主的意思好像是要把.xconfig文件修改了再下 载到FC中吧,而不是通过参数设置指令将修改过的参数传输给FC,
不知道我的理解是否正确。
沙发
发表于 2011-3-15 15:18 | 只看该作者
数据是以数据包为单位传输的,就像手册里说的,每个数据包由同步信号,控制指令,数据长度和校验和组成(当然这种组成方式是人为设定的,不同厂家很可能不同,但基本大同小异)

FC并不主动发送数据,需要上位机向其发送指令后按要求返回数据(也是以包为单位),上位机收到这个包后要对这个包进行解析,提取自己需要的内容。

我是使用同步信号和数据长度来获取一个完整的数据包的,然后通过校验和判断数据是否正确。

以下是解析部分的代码
if(getone==1)
     {
     getone=0;
     if(rxd_buffer_locked) return; // if rxd buffer is locked immediately return

        // the rxd buffer is unlocked
        if((ptr_rxd_buffer == 0) && (c == 0x24)) // if rxd buffer is empty and syncronisation character is received
        {
                rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
                crc = c; // init crc
                Form1->Memo1->Lines->Add("start");
                kaishi=1;
                return;
        }

        if((ptr_rxd_buffer == 1)&& kaishi==1)
        {
         rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
         crc += c; // update crc
         kaishi=2;
         Form1->Memo1->Lines->Add("start1");
         return;
        }

        if((ptr_rxd_buffer == 2)&& kaishi==2)
        {
         rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
         crc += c; // update crc
         kaishi=3;
         Form1->Memo1->Lines->Add("start2");
         return;
        }
         if (ptr_rxd_buffer-3 < rxd_buffer[2]&&kaishi==3) // collect incomming bytes
        {
           rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
           crc += c; // update crc
           return;
         }
         else
         {
          kaishi=4;
          }
        if (ptr_rxd_buffer-3 == rxd_buffer[2]&&kaishi==4)
        {
          Form1->Memo1->Lines->Add("start3");
           rxd_buffer[ptr_rxd_buffer] = c; // copy byte to rxd buffer

           if(crc==rxd_buffer[ptr_rxd_buffer])
           {
            ReceivedBytes = ptr_rxd_buffer + 1;// store number of received bytes
            rxd_buffer_locked = TRUE;          // lock the rxd buffer
            Form1->Memo1->Lines->Add("okk");
            Form1->Button4->Click() ;//数据处理并绘图
            }
           else
           {        // checksum invalid
            rxd_buffer_locked = FALSE; // unlock rxd buffer
            }
            ptr_rxd_buffer = 0; // reset rxd buffer pointer
            kaishi=0;
            crc=0;
        }
    }
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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