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