当看到这一点东西时,不要觉得很简单,它也确实很简单,但对于一个初学者,或对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 个通道的值,同时读取标志位(如丢失帧和故障标志)。
你可以根据解析的通道数据,对应不同的按键和开关功能。
不同的遥控器可能会有特定的通道分配,
例如某些开关对应于特定的通道值变化(低、中、高或开关状态)。
当你运行一点代码, 当看操控手柄摇杆时, 会看到输出数值的变化, 我想到这时, 最关键的问题,已经解决了,
Python实现云卓H16手柄SBUS通讯解析
885

被折叠的 条评论
为什么被折叠?



