本帖最后由 liangdyc 于 2013-9-1 21:33 编辑
scaple 发表于 2013-9-1 00:42
前面说漏了一点,如果您需要对例子当中某个字段数值进行更改的话,相应的,最后两位CRC校验码也必须随之改 ...
非常感谢你的帮忙,现在已经收到数据了。正在做数据校验。但是5555,又遇到问题了。 1、比如发送的命令为:FE 06 36 FF BE 42 00 00 01 01 03 01 3D 94。各数据位的含义我已经懂了。3D 94是校验和。我用CRC-16-CCITT校验软件对上面数据进行处理,却获得的不是3D 94,而是44 2F。对FE 02 91 FF BE 15 01 01 78 9B 进行校验,获得的校验和为:FA 7F而不是78 9B。这是怎么一回事?是不是还有其他的问题呢?(刚才又仔细研究下资料,好像是需要校验的数据+ crc_extra )。这个CRC_extra在它那个mavlin库里面可以查到。查到的是: #ifndef MAVLINK_MESSAGE_LENGTHS
#define MAVLINK_MESSAGE_LENGTHS {9, 31, 12, 0, 14, 28, 3, 32, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 25, 23, 30, 101, 22, 26, 16, 14, 28, 32, 28, 28, 22, 22, 21, 6, 6, 37, 4, 4, 2, 2, 4, 2, 2, 3, 13, 12, 19, 17, 15, 15, 27, 25, 18, 18, 20, 20, 9, 34, 26, 46, 36, 0, 6, 4, 0, 21, 18, 0, 0, 0, 20, 0, 33, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 56, 42, 33, 0, 0, 0, 0, 0, 0, 0, 26, 32, 32, 20, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 8, 4, 12, 15, 13, 6, 15, 14, 0, 12, 3, 8, 28, 44, 3, 9, 22, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 30, 18, 18, 51, 9, 0}
#endif
#ifndef MAVLINK_MESSAGE_CRCS
#define MAVLINK_MESSAGE_CRCS {50, 124, 137, 0, 237, 217, 104, 119, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 214, 159, 220, 168, 24, 23, 170, 144, 67, 115, 39, 246, 185, 104, 237, 244, 222, 212, 9, 254, 230, 28, 28, 132, 221, 232, 11, 153, 41, 39, 214, 223, 141, 33, 15, 3, 100, 24, 239, 238, 30, 240, 183, 130, 130, 0, 148, 21, 0, 52, 124, 0, 0, 0, 20, 0, 152, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 183, 63, 54, 0, 0, 0, 0, 0, 0, 0, 175, 102, 158, 208, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 219, 208, 188, 84, 22, 19, 21, 134, 0, 78, 68, 189, 127, 111, 21, 21, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 49, 170, 44, 83, 46, 0}
#endif
这个里面具体是怎样定义的?仔细看了一下长度为9的就可以看到CRC_extra有50,46两个值。具体怎么选啊?能仔细说明下吗?最好举个例子。非常感谢
刚刚又查看了地面站源代码程序,发现他里面做了这个定义:const int X25_INIT_CRC = 0xffff; const int X25_VALIDATE_CRC = 0xf0b8; 好像是0xffff作为CRC—extra的值。但是还是不对。WHY?
2、另外对命令的生成自己也有一些疑问。例如你前面教给我的发送FE 02 91 FF BE 15 01 01 78 9B 可以获得数据,非常成功哦。的确是大神,但是疑问来了。对于这已组数据每一位的含义我基本了解了。FE为头,02表示有两个有效数据,91为数据包序列号,FF为系统ID,BE 为组件ID,15为消息ID,01 01两个为数据, 78 9B为校验和。可是如果我现在想写一条让APM发送姿态数据的消息,除了FE以及校验和可以最后确定。那么其他数据位的数据是怎样确定的呢?我也查看了MAVLINK协议说明,很多只是说了某个命令的含义。至于发送命令时,每一位是怎样确定的,却没有说明。您能详细解释下吗?或者举个详细的例子说明下,谢谢了,。 (刚查了资料,总不能什么都让您帮解答吧嘿嘿。消息ID 是固定在协议里的 ,可变化的。组件ID ,系统ID 都是可变得 是根据飞行器类型,模式所定的。这一点自己可以理解了。对了我用的是四旋翼飞行器。)
3、 还有我通过发送那条指令,从APM获取了一些数据,其中一条为:FE 19 58 01 01 16 00 00 00 00 10 01 01 01 4D 4E 54 5F 52 43 5F 49 4E 5F 50 41 4E 00 00 00 02 3E 4B。根据这包数据,我知道其中00 00 00 00 10 01 01 01 4D 4E 54 5F 52 43 5F 49 4E 5F 50 41 4E 00 00 00 02这些为有效数据。但是怎样把他合成有效的或者说我们能够看懂的数据,这里就不大清楚了。比如多少个数据表示的是同一个数,或者哪一个数是表示的正负?因为我们平时在实验室,通信协议和格式都是自己规定的,很少用其他的,所以,这里自己就遇到难题了。
再次对你前面对我的帮助表示感谢啊。
|