python云卓H16手柄sbus通讯

Python实现云卓H16手柄SBUS通讯解析
部署运行你感兴趣的模型镜像

当看到这一点东西时,不要觉得很简单,它也确实很简单,但对于一个初学者,或对sbus协议,或者串口通讯,还不太了解的人来说,这是非常困难的东西,

对于串口通讯, 一定要有一个数据帧的概念, 什么是数据帧, 通俗说就是一段数据,二进制的也好,十进制的也好,十六进制的也罢,总之就是一段数据,这段数据,在传输时是电平(电压也可能是频率)信号,反应成数字信号是就0和1,在程序中看到的,一般情况下就是十进制,也可能是转成的十六进制,这些数据表示了某种意思,比如,以什么数据开头,以什么数据结尾,一共有多少数据,数据内容的意义是什么,以及校验位等等, 而这些是提前规定好的, 也就是所谓的协议.

SBUS 数据帧通常包括 16 个通道的数据,其中前几个通道是用于摇杆的控制值(如左右摇杆的 X、Y 轴),
其余通道则可以对应到手柄上的开关和按键(如 SWA、SWB 等)。
为了获取所有按键和开关的状态,你需要解析更多的通道数据,并处理帧末尾的标志位。

SBUS 帧格式:
每个帧为 25 字节:
1 个字节的起始标志。
22 个字节的数据,表示最多 16 个通道(每个通道 11 位)。
1 个字节的标志位(表示丢失帧或故障标志)。
1 个字节的结束标志。


import serial

# 初始化串口
port = '/dev/ttyUSB0'  # 根据实际串口设备修改
baudrate = 100000
ser = serial.Serial(port, baudrate, timeout=0.01)

def parse_sbus_frame(frame):
    if len(frame) != 25:
        return None
    
    channels = [0] * 16
    # 解析 16 个控制通道的值
    channels[0] = ((frame[1] | frame[2] << 8) & 0x07FF)
    channels[1] = ((frame[2] >> 3 | frame[3] << 5) & 0x07FF)
    channels[2] = ((frame[3] >> 6 | frame[4] << 2 | frame[5] << 10) & 0x07FF)
    channels[3] = ((frame[5] >> 1 | frame[6] << 7) & 0x07FF)
    channels[4] = ((frame[6] >> 4 | frame[7] << 4) & 0x07FF)
    channels[5] = ((frame[7] >> 7 | frame[8] << 1 | frame[9] << 9) & 0x07FF)
    channels[6] = ((frame[9] >> 2 | frame[10] << 6) & 0x07FF)
    channels[7] = ((frame[10] >> 5 | frame[11] << 3) & 0x07FF)
    channels[8] = ((frame[12] | frame[13] << 8) & 0x07FF)
    channels[9] = ((frame[13] >> 3 | frame[14] << 5) & 0x07FF)
    channels[10] = ((frame[14] >> 6 | frame[15] << 2 | frame[16] << 10) & 0x07FF)
    channels[11] = ((frame[16] >> 1 | frame[17] << 7) & 0x07FF)
    channels[12] = ((frame[17] >> 4 | frame[18] << 4) & 0x07FF)
    channels[13] = ((frame[18] >> 7 | frame[19] << 1 | frame[20] << 9) & 0x07FF)
    channels[14] = ((frame[20] >> 2 | frame[21] << 6) & 0x07FF)
    channels[15] = ((frame[21] >> 5 | frame[22] << 3) & 0x07FF)
    
    # 标志位(第 23 个字节),可用于检测丢失帧和故障标志
    flags = frame[23]
    failsafe_active = flags & 0x08
    frame_lost = flags & 0x04
    
    return channels, failsafe_active, frame_lost

while True:
    # 读取 25 字节的 SBUS 数据帧
    data = ser.read(25)
    
    if data:
        result = parse_sbus_frame(data)
        if result:
            channels, failsafe_active, frame_lost = result
            print("Channels:", channels)
            print("Failsafe Active:", bool(failsafe_active))
            print("Frame Lost:", bool(frame_lost))


此代码解析所有 16 个通道的值,同时读取标志位(如丢失帧和故障标志)。
你可以根据解析的通道数据,对应不同的按键和开关功能。
不同的遥控器可能会有特定的通道分配,
例如某些开关对应于特定的通道值变化(低、中、高或开关状态)。

当你运行一点代码, 当看操控手柄摇杆时, 会看到输出数值的变化, 我想到这时, 最关键的问题,已经解决了,

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值