SBUS协议是一种串口通信协议,采用100K的波特率(非标准型),8位数据位,两位停止位,偶效验。具体原理看别人的https://blog.youkuaiyun.com/weixin_74923758/article/details/145517855?fromshare=blogdetail&sharetype=blogdetail&sharerId=145517855&sharerefer=PC&sharesource=2301_76760393&sharefrom=from_link
使用Temios2结构体将串口设置为非标准波特率
#include <asm-generic/termbits.h>
//具体是哪个库请使用命令行 'grep -r "termios2" /usr/include' 然后问AI应该怎么使用头文件
// 配置串口参数
int configure_serial_port(int fd) {
struct termios2 options;
// 获取当前串口配置
if (ioctl(fd, TCGETS2, &options) != 0) {
printf("Failed to get current serial port configuration, status %d\n", fd);
close(fd);
return -1;
}
// 清除波特率标志
options.c_cflag &= ~CBAUD;
options.c_cflag |= BOTHER; // 设置自定义波特率
// 设置波特率为 100Kbps,使用 BOTHER 来指定自定义波特率
options.c_ispeed = SBUS_BAUDRATE; // 设置输入波特率
options.c_ospeed = SBUS_BAUDRATE; // 设置输出波特率
// 设置 8 位数据位
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
// 设置偶校验
options.c_cflag &= ~(PARODD | CMSPAR);
options.c_cflag |= PARENB;
// 设置 2 个停止位
options.c_cflag |= CSTOPB;
// 清理输入标志
options.c_iflag &= ~(INPCK | IGNBRK | IGNCR | ISTRIP);
// 清理输出标志
options.c_oflag &= ~OPOST;
// 清理本地标志,禁用回显和特殊字符处理
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
// 启用读取和本地模式
options.c_cflag |= (CREAD | CLOCAL);
// 设置最小读取字符数和读取超时
options.c_cc[VMIN] = 1; // 至少读取 1 字节
options.c_cc[VTIME] = 0; // 没有超时
// 应用新的串口设置
if (ioctl(fd, TCSETS2, &options) != 0) {
printf("Failed to apply new serial port settings, status %d\n", fd);
close(fd);
return -1;
}
return 0;
}
比如我的termios2结构体的定义在<asm-generic/termbits.h>这个库中
我用到的遥控器是8通道的,下面是数据解密
// 用来解析SBUS数据包的函数
void PauseSBusData(uint8_t *packet) {
values[0] = (packet[1] | packet[2]<<8) & 0x07FF;
values[1] = (packet[2]>>3 | packet[3]<<5) & 0x07FF;
values[2] = (packet[3]>>6 | packet[4]<<2 | packet[5]<<10) & 0x07FF;
values[3] = (packet[5]>>1 | packet[6]<<7) & 0x07FF;
values[4] = (packet[6]>>4 | packet[7]<<4) & 0x07FF;
values[5] = (packet[7]>>7 | packet[8]<<1 | packet[9]<<9) & 0x07FF;
values[6] = (packet[9]>>2 | packet[10]<<6) & 0x07FF;
values[7] = (packet[10]>>5 | packet[11]<<3) & 0x07FF;
}