Linux系统之SBUS协议

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值