【交流帖】关于遥控器协议里没有说明的部分
![Nemo_o](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/avatar/pre/v1/000000034_avatar_big.jpg)
这是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_t s1:2;
uint8_t s2: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[18];
}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[0]| (sbus_rx_buffer[1] << 8)) & 0x07ff; //!< Channel 0
RC_Ctl.rc.ch1 = ((sbus_rx_buffer[1] >> 3) | (sbus_rx_buffer[2] << 5)) & 0x07ff; //!< Channel 1
RC_Ctl.rc.ch2 = ((sbus_rx_buffer[2] >> 6) | (sbus_rx_buffer[3] << 2) | //!< Channel 2
(sbus_rx_buffer[4] << 10)) & 0x07ff;
RC_Ctl.rc.ch3 = ((sbus_rx_buffer[4] >> 1) | (sbus_rx_buffer[5] << 7)) & 0x07ff; //!< Channel 3
RC_Ctl.rc.s1 = ((sbus_rx_buffer[5] >> 4)& 0x000C) >> 2; //!< Switch left
RC_Ctl.rc.s2 = ((sbus_rx_buffer[5] >> 4)& 0x0003); //!< Switch right
RC_Ctl.mouse.x = sbus_rx_buffer[6] | (sbus_rx_buffer[7] << 8); //!< Mouse X axis
RC_Ctl.mouse.y = sbus_rx_buffer[8] | (sbus_rx_buffer[9] << 8); //!< Mouse Y axis
RC_Ctl.mouse.z = sbus_rx_buffer[10] | (sbus_rx_buffer[11] << 8); //!< Mouse Z axis
RC_Ctl.mouse.press_l = sbus_rx_buffer[12]; //!< Mouse Left Is Press ?
RC_Ctl.mouse.press_r = sbus_rx_buffer[13]; //!< Mouse Right Is Press ?
RC_Ctl.key.v = sbus_rx_buffer[14] | (sbus_rx_buffer[15] << 8); //!< KeyBoard value
数据帧里有一个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_t s1:2;
uint8_t s2: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[18];
}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[0]| (sbus_rx_buffer[1] << 8)) & 0x07ff; //!< Channel 0
RC_Ctl.rc.ch1 = ((sbus_rx_buffer[1] >> 3) | (sbus_rx_buffer[2] << 5)) & 0x07ff; //!< Channel 1
RC_Ctl.rc.ch2 = ((sbus_rx_buffer[2] >> 6) | (sbus_rx_buffer[3] << 2) | //!< Channel 2
(sbus_rx_buffer[4] << 10)) & 0x07ff;
RC_Ctl.rc.ch3 = ((sbus_rx_buffer[4] >> 1) | (sbus_rx_buffer[5] << 7)) & 0x07ff; //!< Channel 3
RC_Ctl.rc.s1 = ((sbus_rx_buffer[5] >> 4)& 0x000C) >> 2; //!< Switch left
RC_Ctl.rc.s2 = ((sbus_rx_buffer[5] >> 4)& 0x0003); //!< Switch right
RC_Ctl.mouse.x = sbus_rx_buffer[6] | (sbus_rx_buffer[7] << 8); //!< Mouse X axis
RC_Ctl.mouse.y = sbus_rx_buffer[8] | (sbus_rx_buffer[9] << 8); //!< Mouse Y axis
RC_Ctl.mouse.z = sbus_rx_buffer[10] | (sbus_rx_buffer[11] << 8); //!< Mouse Z axis
RC_Ctl.mouse.press_l = sbus_rx_buffer[12]; //!< Mouse Left Is Press ?
RC_Ctl.mouse.press_r = sbus_rx_buffer[13]; //!< Mouse Right Is Press ?
RC_Ctl.key.v = sbus_rx_buffer[14] | (sbus_rx_buffer[15] << 8); //!< KeyBoard value
请问这篇文章对你有用吗?
【交流帖】关于遥控器协议里没有说明的部分