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

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

关于mavlink协议,求助

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-2 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FE 02 91 FF BE 15 01 01 78 9B
上面是别人提供的一组命令。每个数据位的含义我都清楚,现在遇到的问题是,校验和78 9B是怎样得出来的?能详细解释下吗?
有朋友告诉我去查MAVLINK_MESSAGE_LENGTHS和MAVLINK_MESSAGE_CRCS,然后将02 91 FF BE 15 01 01+取得的那个值一起进行CRC校验就可以获得了。可是具体哪个查表获得值怎么弄?或者说具体校验和是怎么来的?谁能举个详细的例子说明下。本人比价笨,你说个大概我很难懂。谢谢了啊

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

主题

  • 没有相关信息
  • 没有相关信息
  • 没有相关信息
沙发
 楼主| 发表于 2013-9-2 11:42 | 只看该作者



没人懂吗?大神没在?怪不得论坛的视频里面把PID都能说成是PDI。。。。

3
发表于 2013-9-2 12:15 | 只看该作者



第一:不是你一问问题就有人必须回答的!
第二:MAVLink是一个开源协议,你可以自己去看全部的源码!
附上计算函数,如果你有学习心得可以发帖造福大家!

计算函数:
#ifndef HAVE_CRC_ACCUMULATE
/**
* @brief Accumulate the X.25 CRC by adding one char at a time.
*
* The checksum function adds the hash of one char at a time to the
* 16 bit checksum (uint16_t).
*
* @param data new char to hash
* @param crcAccum the already accumulated checksum
**/
static inline void crc_accumulate(uint8_t data, uint16_t *crcAccum)
{
        /*Accumulate one byte of data into the CRC*/
        uint8_t tmp;

        tmp = data ^ (uint8_t)(*crcAccum &0xff);
        tmp ^= (tmp<<4);
        *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
}
#endif


4
 楼主| 发表于 2013-9-2 13:10 | 只看该作者
dy008 发表于 2013-9-2 12:15
第一:不是你一问问题就有人必须回答的!
第二:MAVLink是一个开源协议,你可以自己去看全部的源码!
...

呵呵。
public static ushort crc_accumulate(byte b, ushort crc)
        {
            unchecked
            {
                byte ch = (byte)(b ^ (byte)(crc & 0x00ff));
                ch = (byte)(ch ^ (ch << 4));
                return (ushort)((crc >> 8) ^ (ch << 8) ^ (ch << 3) ^ (ch >> 4));
            }
        }


5
发表于 2013-9-2 14:22 | 只看该作者
liangdyc 发表于 2013-9-2 13:10
呵呵。
public static ushort crc_accumulate(byte b, ushort crc)
        {

你看吧,没人回复你就酸一下大家,一有回复呢马上现出自己都知道!
晓得大家不愿回答的部分原因了吧!

当然还跟更多地人不是真正从开源项目里学习底层的知识,而是跟着玩玩而已,所以也就不会有很多理解深刻的人给你指导,
看你近段时间发了不少APM的问题,也许你也是少数几个想知道更多的人,希望你能把学习结果整理了发上来!

想想这些出色的开源项目99%都是些外国人合力搞的,再看看他们的缜密的组织方式、严谨的编程习惯、开放的项目态度。
这个差距真的太大了!


6
 楼主| 发表于 2013-9-2 15:00 | 只看该作者
dy008 发表于 2013-9-2 14:22
你看吧,没人回复你就酸一下大家,一有回复呢马上现出自己都知道!
晓得大家不愿回答的部分原因了吧!
...

呵呵,我不是酸大家。我贴那个程序的意思是,源代码我有,也能看懂一部分。而我问的不是怎么算CRC,CRC原理我也懂。我是问根据代码发现,计算校验和的时候是对数据+一个量值,进行CRC校验。那个量值是怎么来的?怎么确定的?
而你却没看懂我的问题,上来就说看源代码,呵呵。我没要求别人必须回答,而且我也说的是事实。论坛里面很多人也就是花了一堆钱,买了一些东西,组装起来,最多就是调调PID参数,飞机稳定飞行了,就拍个照,贴出来,然后无数人就膜拜大神。我也不是嘲笑或者其他的,我承认论坛里面有一部分大神存在,且有一些的确帮了我很多。我只是很烦那些不是大神却装大神的人。你会你可以不解答,你解答就解答清楚,动不动就说个很模糊,一句“看代码”(没有针对你的意思),要不就是“调调PID”,亲,您老知道PID中的P,I,D分别是什么含义吗?地面站里面那么多PID参数,每个对应的哪个,变化后会产生什么变化,您懂吗?所以很多问题不是一句调节下PID参数或者那些自认为大神的很模糊的一句话就解决了的。你可以不回答,要回答就回答的像个样。OK。个人意见

7
发表于 2013-9-2 15:21 | 只看该作者
liangdyc 发表于 2013-9-2 15:00
呵呵,我不是酸大家。我贴那个程序的意思是,源代码我有,也能看懂一部分。而我问的不是怎么算CRC,CRC原 ...

好的,你说得很清楚了!

我也是根据你的第二句话才提出上述意见的!

毕竟你还是打算问问题,所以我说的是你的表述态度,如果你问的问题有人懂并且还有时间,那么在看到你谦虚的态度下有可能会回复!
请记住,有义务教你或回答你的只有你的老师!其他人都是基于各种理由来回答,当然也就可以不回答!

好了,关于你的MAVlink问题我也回答不了,因为我也是肤浅看了一下,希望有你说得“大神”能够现身,而我也完成帮你顶贴的无用功!
今天中午真是闲得!

8
 楼主| 发表于 2013-9-2 17:41 | 只看该作者
dy008 发表于 2013-9-2 16:46
好吧,我刚刚看了一下大概是这样的:
首先数据包是这样形成的:
if (mavlinkversion == 3)

FE 09 06 01 01 00 00 00 00 00 02 03 51 04 03 10 D3
这是我接收到的一组数据。你试试,我试了,算出来的不是10 D3。就在这里卡主了。

9
发表于 2013-9-2 22:59 | 只看该作者
本帖最后由 dy008 于 2013-9-2 23:03 编辑
liangdyc 发表于 2013-9-2 17:41
FE 09 06 01 01 00 00 00 00 00 02 03 51 04 03 10 D3
这是我接收到的一组数据。你试试,我试了,算出来 ...

这个问题关键在于计算CRC的时候是不计算包头的,请把包头0xFE去掉,再按前面说的方法即可计算出正确的CRC字段。程序如下:
public static ushort crc_calculate(byte[] pBuffer, int length)
        {
            if (length < 1)
            {
                return 0xffff;
            }
            // For a "message" of length bytes contained in the unsigned char array
            // pointed to by pBuffer, calculate the CRC
            // crcCalculate(unsigned char* pBuffer, int length, unsigned short* checkConst) < not needed

            ushort crcTmp;
            int i;

            crcTmp = X25_INIT_CRC;

            for (i = 1; i < length; i++) // skips header         //注意这里是跳过了包头的!
            {
                crcTmp = crc_accumulate(pBuffer, crcTmp);
                //Console.WriteLine(crcTmp + " " + pBuffer + " " + length);
            }

            return (crcTmp);
        }

另外注意CRC字段是低位在前,最后才是高位!


10
发表于 2013-9-3 00:12 | 只看该作者
本帖最后由 baochen12 于 2013-9-3 00:21 编辑

首先,我想说我就是什么都不懂,我连你问的是什么都不知道,但是我知道请教别人的最起码的态度,那就是尊重和谦虚,没有人有必要无条件的去帮助谁,去回答谁的问题,遇到问题着急解决的心情谁都可以理解,你发问了,有人帮你解决了,那么你好我好大家好,没解决,别怪别人,还是自己学艺不精。但是不要在背后说一些别人怎么说PID或者PDI这一类没营养的话,贬低他人能给你带来什么好处吗?无论人家做的好与不好,至少人家做了,人家拿出来分享了,你看不惯可以不看,听不惯也可以不听,何必要这么说话?要不你做个更好的出来。再者,你要是真的懂那么多,又何必出来问别人,又或者,你拿1W块钱出来悬赏解答,1W没有人理那就10W,你要是有这个魄力我相信大家会理解你为什么高傲,否则还是谦虚一点吧,至少没听说过有谦虚死的。还有,我真的想说我什么都不懂,上面的对话在我看来就是一个大学数学老师被小学数学题难住了,别人告诉他一个高中数学公式,然后他又拿大学数学给顶回去了,其实他的本意是想找个教授来帮忙解答,没想到来了个高中生,人家好心反遭挖苦,呵呵,不知道我这个比方恰当不恰当,得出结论就是,您一个大学老师挖苦高中生水平不行,背后一个教授看着您笑而不语,您挖苦完了教授也走了。当然这个教授肯定不会是我,我没有那么大的本事,但是或许那个教授就是浏览这帖子的某一位,在看了您的对话后微笑着关掉了窗口。好吧,我的故事讲完了,如果不入谁的法眼,劳烦您笑笑就过吧,放过我这个不知天高地厚的小青年吧。

11
 楼主| 发表于 2013-9-3 09:14 | 只看该作者
dy008 发表于 2013-9-2 22:59
这个问题关键在于计算CRC的时候是不计算包头的,请把包头0xFE去掉,再按前面说的方法即可计算出正确的CRC ...

就是不计算包头。我用的CRC工具。

12
发表于 2013-9-3 10:00 | 只看该作者
liangdyc 发表于 2013-9-3 09:14
就是不计算包头。我用的CRC工具。

请使用源代码中的计算方法!


13
发表于 2013-9-3 10:01 | 只看该作者
baochen12 发表于 2013-9-3 00:12
首先,我想说我就是什么都不懂,我连你问的是什么都不知道,但是我知道请教别人的最起码的态度,那就是尊重 ...

这个小青年是个明白人!

14
发表于 2013-9-3 10:18 | 只看该作者
鄙视这种人。。
15
发表于 2013-10-11 18:31 | 只看该作者
mavlink的校验和 你弄明白的吗   我也么弄懂  还请赐教  谢谢
16
发表于 2015-4-10 15:09 | 只看该作者
楼主,本人目前新手一枚,还没搞懂这个通讯协议内容中每一位的含义,能麻烦您给讲解一下么? 另外您的CRC搞出来了么?
17
发表于 2015-11-23 22:29 | 只看该作者
我用c#串口助手接了apm之后,发现全是心跳包。是不是需要请求参数才能返回姿态数据?
18
发表于 2015-11-23 22:30 | 只看该作者
希望能得到楼主的帮助,谢谢了~
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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