1赞

12回答

1收藏

通信协议-1.0

#开源分享 #开源分享 9557 人阅读 | 12 人回复 | 2013-06-03

通信以包为单位,传输介质有三种:nRF24L01+、串口和TCP。
如无特别说明,字节顺序为小端顺序。

nRF24L01+的包格式为:
    1.协议版本:uint8_t
    2.包类型:uint8_t
    3.包内容:uint8_t[]
    4.CRC-16-CCITT校验:uint16_t,计算范围为1~3,大端字节顺序。

串口和TCP的包格式为:
    1.包前导符:uint8_t[2] = {0x55,0xAA}
    2.包长度:uint8_t,等于3~6的字节数。
    3.协议版本:uint8_t
    4.包类型:uint8_t
    5.包内容:uint8_t[]
    6.CRC-16-CCITT校验:uint16_t,计算范围为3~5,大端字节顺序。

协议版本
0x00 => 调试版。

包类型和包内容
0x01 => 返回姿态四元数,包内容={wxyz:float[4]}。
0x04 => 返回位置,包内容={xyz:float[3]}。
0x06 => 获取四元数姿态,包内容空。
0x09 => 获取位置,包内容空。
0x14 => 获取xyz向量,包内容={type:uint8_t}。
        type=0x01,加速度计原始值
        type=0x02,加速度计校正值
        type=0x03,陀螺仪原始值
        type=0x04,陀螺仪校正值
        type=0x05,罗盘原始值
        type=0x06,罗盘校正值
0x15 => 返回xyz向量,包内容={type:uint8_t,xyz:float[3]}。
        type为向量类型,取值同0x14包;
0x16 => 返回示波器值,包内容={channel:uint8_t,value:float[]}。
        value[i]的通道号为channel+i。
0x18 => 获取状态。包内容={which:uint8_t[]}。
        which[i]=0x01,电池电压。
        which[i]=0x02,当前电机油门值。
0x19 => 返回状态。包内容={which:uint8_t,value}
        which[i]=0x01,电池电压,value={voltage:float}。
        which[i]=0x02,当前电机油门值,value={throttle:float[4]}。
0x1A => 返回消息。包内容={msg:char[]},UTF-8编码,不带结束符'\0'。
0x1B => Bootloader命令,包内容={cmd:uint8_t,param}。
        cmd=0x01,进入Bootloader模式,param空。
        cmd=0x02,开始刷app,param空。
        cmd=0x03,设置app长度和crc,param={len:uint32_t,crc:uint32_t}。
        cmd=0x04,写app,param={blockIndex:uint16_t,data:uint32_t[]}。
        cmd=0x05,查询有哪些未写的块,param空。
        cmd=0x06,进入app。
0x1C => Bootloader状态。包内容={status:uint8_t,param}。
        status=0x01,Bootloader等待命令状态,param空。
        status=0x02,准备好刷app,param空。
        status=0x03,正在写app,param={bytesWrittenAmount:uint32_t}。
        status=0x04,返回有哪些未写的块,param={{index:uint16_t,length:uint16_t}[]}。
        status=0x05,写入完成,但crc检验失败,param空。
        status=0x06,刷app成功,param空。
        status=0x07,已经进入app。
0x1D => 操作参数模块。包内容={code:uint8_t,param}。
        code=0x11,读RAM,param={pos:uint8_t,len:uint8_t}。
        code=0x12,返回RAM的值,param={pos:uint8_t,value:float[]}。
        code=0x13,写入RAM,param={pos:uint8_t,value:float[]}。
        code=0x21,读Flash,param={pos:uint8_t,len:uint8_t}。
        code=0x22,返回Flash的值,param={pos:uint8_t,value:float[]}。
        code=0x23,写入Flash,param空。
        code=0x25,重置Flash里的参数为默认值,param空。
0x1E => 锁定姿态模式控制,param={code:uint8_t,param}
        code=0x01,起飞前准备,param空。包括航偏角校正等。
        code=0x02,已准备好起飞,param空。
        code=0x03,未准备好起飞,param空。
        code=0x04,设定控制参数,param={t:float,wxyz:float[4]},
                   t为基础油门,wxyz为控制四元数。


分享到:
回复

使用道具 举报

回答|共 12 个

倒序浏览

沙发

heroe1

发表于 2013-6-4 09:57:20 | 只看该作者

沙发                              
板凳

圆点博士小四轴

发表于 2013-6-4 23:47:15 | 只看该作者

顶!非常好的通讯方式。
地板

yz0853

发表于 2013-6-6 14:35:15 | 只看该作者

牛逼。..... 持续关注中。
5#

steeven_3009566

发表于 2013-6-6 23:19:51 | 只看该作者

请教一下, 买的玩具飞碟遥控器能否监听到其对码和按键内容, 然后自己编程到手机上遥控?
6#

nemon

发表于 2013-6-7 08:40:34 | 只看该作者

steeven 发表于 2013-6-6 23:19
请教一下, 买的玩具飞碟遥控器能否监听到其对码和按键内容, 然后自己编程到手机上遥控? ...

如果卖的时候没说可以用手机遥控一般就不行了
玩具上一般都会贴着用的哪个频段
估计不在手机支持的范围内
先看看吧
7#

steeven_3009566

发表于 2013-6-7 20:06:28 | 只看该作者

nemon 发表于 2013-6-7 08:40
如果卖的时候没说可以用手机遥控一般就不行了
玩具上一般都会贴着用的哪个频段
估计不在手机支持的范围内 ...

我在淘宝上买的优迪u816a, 遥控频率2.4G, 想试试用手机的重力感应控制飞碟,就像玩平衡球游戏一样。
听说有手机到2.4G的发射器,专用软件通过耳机插口输出编码,然后用发射器发射。

这几天查了一下2.4G遥控原理,貌似不同模块把协议都封装了,外面只要输入数据,所以我在想如果都是遵循遥控标准,应该可以diy一个模块跟它握手,收到相关信息,把频率之类的协商好,然后监听不同按键的编码就可以。

如果不是标准,是不是可以拆开遥控模型或者遥控器看看用什么芯片, 找个芯片来对口接收。
或者用示波器看看射频模块的波形?

最差就是用个天线在旁边接收,然后用示波器显示波形。
8#

nemon

发表于 2013-6-8 08:53:53 | 只看该作者

steeven 发表于 2013-6-7 20:06
我在淘宝上买的优迪u816a, 遥控频率2.4G, 想试试用手机的重力感应控制飞碟,就像玩平衡球游戏一样。
听说 ...

好主意啊!把过程发出来让大家围观一下吧
9#

steeven_3009566

发表于 2013-6-8 12:31:48 | 只看该作者

还在设想呢。。。。没玩过这东西。。。
10#

js200300953

发表于 2013-6-8 19:07:20 | 只看该作者

steeven 发表于 2013-6-6 23:19
请教一下, 买的玩具飞碟遥控器能否监听到其对码和按键内容, 然后自己编程到手机上遥控? ...

成品估计不行。我们这个小四轴支持蓝牙,可以用手机控制。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条