BetaFlight模块设计之三十二:MSP协议模块分析

若瑜8个月前行业资讯888

基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。


1. MSP协议模块

1.1 MSP描述

MSP是Multiwii Serial Protocol的缩写,截止目前为止有两个版本V1和V2。它是一个远程消息协议,主要用在iNav、MultiWii、 CleanFlight、BetaFlight的飞控上。


MSP协议定义了request-response protocol通信机制。发起request一方被认为是"MSP Master",反馈response的一方被认为是"MSP Slave"。


1.2 MSP版本优缺点

鉴于V1版本在使用过程发现如下问题:


ID支持最大255个,在飞控的发展过程,已经基本用尽。

消息体最多只有255字节的Payload,对于巨帧(JUMBO frame)来说也是一个限制。

checksum(XOR checksum)不够健壮,不能很好的检测通信错误。

在此基础上V2版本做了如下调整:


16bit IDs, 兼容IDs 0-255(MSP V1)。

16bit Payload,扩展了一帧字节数。

checksum(crc8_dvb_s2),相较于XOR算法更加健壮和稳定。

1.3 MSP代码资源

src/main/msp/
├── msp_box.c
├── msp_box.h
├── msp.c
├── msp.h
├── msp_protocol.h
├── msp_protocol_v2_betaflight.h
├── msp_protocol_v2_common.h
├── msp_serial.c
└── msp_serial.h

0 directories, 9 files

2. MSP报文解析

通过阅读mspSerialProcessReceivedData代码,我们可以得到报文格式:


2.1 MSP收包状态机

注:收包状态机,任何一个状态出错回到IDLE(初始态)。

MSP报文收包状态机

image.png

2.2 MSP报文格式

  +---+---+--------+---------+--------+-------------------------------------------------------------+-------------+
  |                            Multiwii Serial Protocol V1                              length = 6 + payload size |
  +---+---+--------+---------+--------+-------------------------------------------------------------+-------------+
  | $ | M | < or > | size(1) | cmd(1) | payload(0-255)                                              | checksum_v1 |
  +---+---+--------+---------+--------+-------------------------------------------------------------+-------------+

  +---+---+--------+---------+--------+------+---------+---------+--------------------+-------------+-------------+  
  |                            Multiwii Serial Protocol V2 over V1                     length = 12 + payload size |
  +---+---+--------+---------+--------+------+---------+---------+--------------------+-------------+-------------+  
  | $ | M | < or > | size(1) | 255    | flag | cmd(2)  | size(2) | payload(16bit len) | checksum_v2 | checksum_v1 |
  +---+---+--------+---------+--------+------+---------+---------+--------------------+-------------+-------------+  

  +---+---+--------+---------+--------+------+---------+------------------------------+-------------+
  |                            Multiwii Serial Protocol V2                length = 9 + payload size |
  +---+---+--------+---------+--------+------+---------+------------------------------+-------------+
  | $ | X | < or > | flag(1) | cmd(2)        | size(2) | payload(16bit len)           | checksum_v2 |
  +---+---+--------+---------+--------+------+---------+------------------------------+-------------+

‘$’:表示SOF(Start Of a frame)

‘M’:表示V1 or V2 over V1

‘X’:表示V2

‘<’: 表示request

‘>’:表示response

typedef struct __attribute__((packed)) {
    uint8_t size;
    uint8_t cmd;
} mspHeaderV1_t;

typedef struct __attribute__((packed)) {
    uint8_t  flags;
    uint16_t cmd;
    uint16_t size;
} mspHeaderV2_t;


3. MSP报文处理

3.1 MSP请求报文处理(mspSerialProcessReceivedCommand)

mspFcProcessCommand
 ├──> MSP_RESULT_ACK, mspCommonProcessOutCommand
 ├──> MSP_RESULT_ACK, mspProcessOutCommand
 ├──> ret = mspFcProcessOutCommandWithArg
 ├──> MSP_RESULT_ACK, mspFcSetPassthroughCommand  //cmdMSP == MSP_SET_PASSTHROUGH
 ├──> MSP_RESULT_ACK, mspFcDataFlashReadCommand   //cmdMSP == MSP_DATAFLASH_READ
 ├──> ret = mspCommonProcessInCommand
 └──> reply->result = ret;

以上函数是针对MSP协议进行实际ID对应的报文进行处理过程。具体报文ID,请参阅:


msp_protocol.h

msp_protocol_v2_common.h

msp_protocol_v2_betaflight.h

3.2 MSP反馈报文处理(mspSerialProcessReceivedReply)

仔细分析了下代码,貌似没有太多用处(至少在Kakute F7上)。

mspFcProcessReply
void mspFcProcessReply(mspPacket_t *reply)
{
    sbuf_t *src = &reply->buf;
    UNUSED(src); // potentially unused depending on compile options.

    switch (reply->cmd) {
    case MSP_ANALOG:
        {
            uint8_t batteryVoltage = sbufReadU8(src);
            uint16_t mAhDrawn = sbufReadU16(src);
            uint16_t rssi = sbufReadU16(src);
            uint16_t amperage = sbufReadU16(src);

            UNUSED(rssi);
            UNUSED(batteryVoltage);
            UNUSED(amperage);
            UNUSED(mAhDrawn);

#ifdef USE_MSP_CURRENT_METER
            currentMeterMSPSet(amperage, mAhDrawn);
#endif
        }
        break;
    }
}

不过有部分机型还是有这方面的需求的,但是不清楚飞控是从哪里读取电流和毫安时。

./src/main/target/SPRACINGF4EVO/target.h:183:#define USE_MSP_CURRENT_METER
./src/main/target/SPRACINGF3EVO/target.h:157:#define USE_MSP_CURRENT_METER
./src/main/target/SPRACINGF7DUAL/target.h:181:#define USE_MSP_CURRENT_METER
./src/main/target/SPRACINGF3/target.h:189:#define USE_MSP_CURRENT_METER
./src/main/target/NUCLEOF303RE/target.h:137:#define USE_MSP_CURRENT_METER

4. 参考资料

【1】iNavFlight之MSP DJI协议分析

【2】iNavFlight之MSP DJI协议天空端请求报文

【3】iNavFlight之MSP DJI协议飞控端请求应答

【4】通过无线自制串口模块连接SpeedyBee或BetaFlightConfigurator

【5】Multiwii Serial Protocol

【6】Multiwii Serial Protocol (MSP)

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/lida2003/article/details/125260025


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  


云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ


相关文章

MySQL运维之日志与主从复制

MySQL运维之日志与主从复制

一、日志1.错误日志错误日志是MySQL中最重要的日志之一,它记录了当mysql启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此...

【Docker】在 Ubuntu 上安装 Docker 的详细指南

【Docker】在 Ubuntu 上安装 Docker 的详细指南

Docker 是一个开源的平台,可以让开发者打包应用及其依赖项为一个可移植的容器。本文将详细介绍如何在 Ubuntu 上安装 Docker,包括安装步骤、常见命令以及一些注意事项。一、准备工...

【网络】NAT、代理服务、内网穿透(2)

【网络】NAT、代理服务、内网穿透(2)

2.代理服务器代理服务器(Proxy Server)的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理。(1)正向代理正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并...

Docker:LXC容器操作实战

Docker:LXC容器操作实战

前言通过LXC来完成容器的创建、体会什么是容器。利用LXC容器技术来隔离特定的应用,提供虚拟执行环境,从而优化资源管理和部署效率。什么是LXC?LXC为Linux Container的简写,是一种可以...

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境Docker-OSXsickcodes/Docker-OSX: Docker-OSX 项目尝试通过 Docker 容...

云端之上的边缘:解读云计算与边缘计算的战略融合

云端之上的边缘:解读云计算与边缘计算的战略融合

一、引言在当前的信息化和数字化浪潮中,云计算和边缘计算作为两种重要的计算模型,各自在不同的场景中发挥着不可替代的作用。它们不仅在概念、特点、应用场景上有所不同,而且在实际应用中常常相互协作,形成了一种...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。