Nemo_o 发表于 2015-5-7 11:48:06

【交流帖】关于遥控器协议里没有说明的部分

这是2015年的协议



数据帧里有一个16位的数据RC_Ctl_Define_t.key.v,每一个位对应一个按键,键盘按下时这个键位就为1,松开就为0。
要用USB线把遥控器联上电脑,打开客户端后才能用键盘鼠标控制,客户端的调试窗口显示的按键信息是没有用的,不用管它。

开关:


如果接收的数据是按如图这样的,那么,遥控器右边的是S1,左边的是S2,跟协议里的相反。

鼠标:
鼠标往左移动,X值为负,往右为正:鼠标往前移动,Y值为负,往后为正:Z轴无用。
虽然鼠标的值域是-32768~32767,但是,以平常的鼠标DPI,最大移动速度是也只到300左右,所以取-300~300就行了,用一个函数限制一下值域,超过300取300。

数据长度:
据某些同学说数据长度是25字节,但是我测得是18字节,遥控器的拨轮没有用。

这个是遥控器的数据结构体,用这个结构体接收数据不需要解析代码,接收的字节流储存在RC_Ctl_t.buf里,然后直接提取相应的数据使用就行了。
typedef union
{
struct
{
    struct
    {
      uint16_t ch0:11;
      uint16_t ch1:11;
      uint16_t ch2:11;
      uint16_t ch3:11;
      uint8_ts1:2;
      uint8_ts2:2;
    }rc;
    struct
    {
      int16_t x;
      int16_t y;
      int16_t z;
      uint8_t press_l;
      uint8_t press_r;
    }mouse;
    struct
    {
      uint16_t v;
    }key;
};
uint8_t buf;
}RC_Ctl_t;

用法:
把遥控器示例里的这一段用上面的结构体替换,然后。。
typedef struct
{
struct
{
uint16_t ch0;
uint16_t ch1;
uint16_t ch2;
uint16_t ch3;
uint8_t s1;
uint8_t s2;
}rc;
struct
{
int16_t x;
int16_t y;
int16_t z;
uint8_t press_l;
uint8_t press_r;
}mouse;
struct
{
uint16_t v;
}key;
}RC_Ctl_t;
然后把这一段删掉就大功告成!
RC_Ctl.rc.ch0 = (sbus_rx_buffer| (sbus_rx_buffer << 8)) & 0x07ff; //!< Channel 0
RC_Ctl.rc.ch1 = ((sbus_rx_buffer >> 3) | (sbus_rx_buffer << 5)) & 0x07ff; //!< Channel 1
RC_Ctl.rc.ch2 = ((sbus_rx_buffer >> 6) | (sbus_rx_buffer << 2) | //!< Channel 2
(sbus_rx_buffer << 10)) & 0x07ff;
RC_Ctl.rc.ch3 = ((sbus_rx_buffer >> 1) | (sbus_rx_buffer << 7)) & 0x07ff; //!< Channel 3
RC_Ctl.rc.s1 = ((sbus_rx_buffer >> 4)& 0x000C) >> 2; //!< Switch left
RC_Ctl.rc.s2 = ((sbus_rx_buffer >> 4)& 0x0003);//!< Switch right
RC_Ctl.mouse.x = sbus_rx_buffer | (sbus_rx_buffer<< 8); //!< Mouse X axis
RC_Ctl.mouse.y = sbus_rx_buffer | (sbus_rx_buffer<< 8); //!< Mouse Y axis
RC_Ctl.mouse.z = sbus_rx_buffer | (sbus_rx_buffer << 8); //!< Mouse Z axis
RC_Ctl.mouse.press_l = sbus_rx_buffer;//!< Mouse Left Is Press ?
RC_Ctl.mouse.press_r = sbus_rx_buffer;//!< Mouse Right Is Press ?
RC_Ctl.key.v = sbus_rx_buffer | (sbus_rx_buffer<< 8); //!< KeyBoard value




lijie 发表于 2015-5-7 17:14:36

typedef union
{
struct
{
    struct
    {
      uint16_t ch0:11;
      uint16_t ch1:11;
      uint16_t ch2:11;
      uint16_t ch3:11;
      uint8_ts1:2;
      uint8_ts2:2;
    }rc;
    struct
    {
      int16_t x;
      int16_t y;
      int16_t z;
      uint8_t press_l;
      uint8_t press_r;
    }mouse;
    struct
    {
      uint16_t v;
    }key;
};
uint8_t buf;
}RC_Ctl_t;
,,,这就花了我23金币,,表示看不懂(不是程序猿):(:@:(:lol

Nemo_o 发表于 2015-10-9 23:19:23

蒙奇路飞 发表于 2015-10-8 23:39
你好!有遥控器协议资料吗???可以发我一份吗?。。。。还有就是那个遥控器是要写程序的吗???我现在有 ...

http://bbs.robomasters.com/forum.php?mod=attachment&aid=Mjc4NXw4OGIyYzgzMXwxNDQ0NDAzNjY4fDM0fDExMjM%3D
遥控器不用写程序,程序写给接收端,用作解析接收到的数据,这个协议配套RM的固件用,遥控器要刷RM固件。

蒙奇路飞 发表于 2015-10-8 23:39:02

你好!有遥控器协议资料吗???可以发我一份吗?。。。。还有就是那个遥控器是要写程序的吗???我现在有一个DT7的遥控器,但是不懂怎么用?还请多多指教。。。。

bingxin 发表于 2015-5-7 12:24:04

怎么弄得啊 求指导

frogzzy 发表于 2015-5-7 19:16:02

干得漂亮 总结得很好啊

Nemo_o 发表于 2015-5-7 20:33:35

bingxin 发表于 2015-5-7 12:24
怎么弄得啊 求指导

什么怎么弄

欧仔 发表于 2015-5-8 06:59:32

哇···太震撼了,楼主看来花了不少功夫啊

zzipeng 发表于 2015-5-9 00:09:46

不错不错。。

m349141450 发表于 2015-5-9 13:35:12

我要咱金币啊哈哈
页: [1] 2
查看完整版本: 【交流帖】关于遥控器协议里没有说明的部分