pixhawk 遥控器 sbus驱动代码解析

一、代码信息    

代码版本    pixhawk官方源码1.5.5版本                  代码路径    Firmware-1.5.5\src\modules\px4iofirmware

下载地址:https://github.com/PX4/Firmware.git

二、驱动解析

首先px4io.c文件是pixhawk协处理器代码最开始运行的地方,也是最重要的一个文件。在该文件中有两个与遥控器数据处理相关的函数,分别为  controls_init()  与  controls_tick ()。

controls_init()函数负责遥控器的数据接收串口的初始化,以及一些初始参数的配置。

其主要函数为     _sbus_fd = sbus_init("/dev/ttyS2", false);       从 stm32_serial.c 文件中可知  /dev/ttyS2 对应的串口为  usart3

然后就是在sbus_init()函数中对串口的配置,具体的配置为

串口波特率为100000,数据位为8位,2个停止位,偶校验。至此串口的初始化完成

int
sbus_config(int sbus_fd, bool singlewire)
{
	int ret = -1;

	if (sbus_fd >= 0) {
		struct termios t;

		/* 100000bps, even parity, two stop bits */
                /*100000波特率,数据位为8位,2个停止位,偶校验*/
		tcgetattr(sbus_fd, &t);
		cfsetspeed(&t, 100000);
		t.c_cflag |= (CSTOPB | PARENB);
		tcsetattr(sbus_fd, TCSANOW, &t);

		if (singlewire) {
			/* only defined in configs capable of IOCTL */
#ifdef TIOCSSINGLEWIRE
			ioctl(sbus_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED);
#endif
		}

		/* initialise the decoder */
		partial_frame_count = 0;
		last_rx_time = hrt_absolute_time();
		last_frame_time = last_rx_time;
		sbus_frame_drops = 0;

		ret = 0;
	}

	return ret;
}

 

controls_tick() 函数的主要功能为对串口数据的获取,解析,归一化处理。

controls_tick()函数中的关键代码为

   bool sbus_updated = sbus_input(_sbus_fd, r_raw_rc_values, &r_raw_rc_count, &sbus_failsafe, &sbus_frame_drop,
                       PX4IO_RC_INPUT_CHANNELS);

bool
sbus_input(int sbus_fd, uint16_t *values, uint16_t *num_values, bool *sbus_failsafe, bool *sbus_frame_drop,
	   uint16_t max_channels)
{
	int		ret = 1;
	hrt_abstime	now;

	now = hrt_absolute_time();

	/*
	 * Fetch bytes, but no more than we would need to complete
	 * a complete frame.
	 */
	uint8_t buf[SBUS_FRAME_SIZE * 2];
	bool sbus_decoded = false;
        /*从串口读数据,并保存至buf中,读的长度为25*/
	ret = read(sbus_fd, &buf[0], SBUS_FRAME_SIZE);

	/* if the read failed for any reason, just give up here */
	if (ret < 1) {
		return false;
	}

	/*
	 * Try to decode something with what we got
	 */
        /*获得数据后对数据进行解帧处理*/
	if (sbus_parse(now, &buf[0], ret, values, num_values, sbus_failsafe,
		       sbus_frame_drop, &sbus_frame_drops, max_channels)) {

		sbus_decoded = true;
	}

	return sbus_decoded;
}

sbus的协议与解帧,可见     参考文章      pixhawk官方的解帧代码是在  sbus_parse()函数中调用  sbus_decode()函数来实现的。具体解帧这里就不详细讲解了,就是对16进制字节的处理而已,至此sbus数据的解析完成,得到遥控器的初始数据。

sbus_input()函数出来后就得到了遥控器的初始数据,接下来就是根据各种参数对遥控器的数据进行  限幅,归一化,重映射,翻转等操作,最后将数据传递给主处理器。

遥控器数据在pixhawk代码中的传输具体流程图可见我的另一篇文章

https://blog.csdn.net/weixin_42487702/article/details/82862228

 

三、感想

至此sbus的驱动代码解析至此结束,由于本人才疏学浅且本文大部分内容均为博主自己对代码的理解,有错误之处还请大家海涵并联系博主,博主将对代码进行进一步更正,谢谢!

 

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值