0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

NCS更改MTU大小

TedLee 来源:jf_29076475 作者:jf_29076475 2025-06-27 17:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

NCS更改MTU大小

一、 什么是MTU

MTU(Maximum Transmission Unit)即最大传输单元,它定义了蓝牙网络层协议一次能传输的最大数据量。在蓝牙低功耗(BLE)通信中,MTU的大小直接影响到数据传输的效率和性能

MTU过小的影响

当MTU设置过小时,会导致以下问题:

  • 数据分片增加 :数据需要被分成更小的片段进行传输,增加了传输的次数和复杂性。
  • 传输效率降低 :频繁的数据分片和重组会消耗更多的带宽和时间。
  • 连接稳定性下降 :过小的MTU可能导致数据包丢失或传输错误,影响连接的稳定性

所以为了能够单包发送更大的数据,服务器和客户端都需要更新它们的MTU。MTU需要满足主机和从机之间允许的最小值,必须支持更大的MTU的迁就支持更小的

MTU

在Zephyr里面CONFIG_BT_BUF_ACL_RX_SIZE CONFIG_BT_L2CAP_TX_MTU这两个宏决定了ZephyrMTU的大小,下图是MTU的关系已经Kconfig对应表
在这里插入图片描述

调用这个发送函数会报-128错误在这里插入图片描述

二、如何修改MTU大小

1、增加主机向从机配置的MTU大小

在prj.conf添加如下几个宏:

CONFIG_BT_L2CAP_TX_MTU=247
CONFIG_BT_BUF_ACL_RX_SIZE=251
CONFIG_BT_BUF_ACL_TX_SIZE=251

添加如上几个宏,从机就支持支持最大的247的MTU了,但是这个是初始化协议栈的时候设置的,而MTU交换是主机和从机建立连接之后进行协商,所以主机可以在连接之后,主动设置从机的MTU大小了,那么怎么设置从机主动发起MTU请求和请求的大小呢:

有两个办法

1.1 第一个办法:固定MTU大小

再上面的宏里面,再添加一个宏就可以实现连接后自动更新NTU大小了

CONFIG_BT_GATT_AUTO_UPDATE_MTU=y

在这里插入图片描述

使用Kconfig search 查询MTU,可以看到下面的描述连接后自动申请MTU大小,为什么我要多此一举呢,因为有些客户不需要申请这么大的MTU,需要动态去修改MTU大小或者自己随着在某个操作里面修改MTU大小,

2、第二个办法:使用函数从机主动向主机申请增加MTU大小

2.1 添加宏

CONFIG_BT_GATT_CLIENT

2.2 在函数里面添加如下代码,然后再connect回调时间里面调用

/*MTU exchange*/
static struct bt_gatt_exchange_params mtu_exchange_params[CONFIG_BT_MAX_CONN];

static void mtu_exchange_cb(struct bt_conn *conn, uint8_t err,
			    struct bt_gatt_exchange_params *params)
{
    LOG_INF("MTU exchange %u %s (%u)", bt_conn_index(conn),
	       err == 0U ? "successful" : "failed", bt_gatt_get_mtu(conn));
}



static int mtu_exchange(struct bt_conn *conn)
{
    uint8_t conn_index;
    int err;

    conn_index = bt_conn_index(conn);

    LOG_INF("MTU (%u): %u", conn_index, bt_gatt_get_mtu(conn));

    mtu_exchange_params[conn_index].func = mtu_exchange_cb;

    err = bt_gatt_exchange_mtu(conn, &mtu_exchange_params[conn_index]);
    if (err) LOG_INF("MTU exchange failed (err %d)", err);
    else LOG_INF("Exchange pending...");

    return err;
}

在connect回调调用:
在这里插入图片描述

三、测试

我们使用nrf下面的串口服务例程进行测试,具体怎么编译程序和烧录可以看我之前写的博客

3.1 添加LOG

void mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
{
	LOG_INF("Updated MTU: TX: %d RX: %d bytesn", tx, rx);
}

static struct bt_gatt_cb gatt_callbacks = {
	.att_mtu_updated = mtu_updated,
};

随后在main函数注册回调:

在这里插入图片描述

3.2 可以看到,默认例程的MTU大小只有23字节大小,每包数据发送超过了这个大小就会报错,

在这里插入图片描述

3.3、在手机上面申请

两个都是一样的,可以看到,连接之后,通过主机更新或者从机和主机申请交换MTU大小也会改变,

在这里插入图片描述

3.4 添加自动连接更新MTU的宏&自己在连接添加MTU更换的宏

在这里插入图片描述

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NCS
    NCS
    +关注

    关注

    1

    文章

    22

    浏览量

    9419
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电子工程师的新宠:NCS2302耳机检测接口IC

    电子工程师的新宠:NCS2302耳机检测接口IC 在电子设备的设计中,耳机检测和发送/结束按钮检测是常见的需求。今天要给大家介绍一款出色的解决方案——安森美(ON Semiconductor
    的头像 发表于 03-11 16:30 150次阅读

    探索NCS35011:低功耗电池监测IC的卓越性能与应用指南

    在电池管理领域,低功耗、高精度的电池监测IC至关重要。onsemi的NCS35011就是这样一款出色的产品,它为3 - 5节串联锂离子电池提供了全面的保护和状态监测功能。下面,我们就来深入了解一下NCS35011的特点、工作原理以及应用注意事项。
    的头像 发表于 12-04 10:15 634次阅读
    探索<b class='flag-5'>NCS</b>35011:低功耗电池监测IC的卓越性能与应用指南

    深入解析onsemi NCS2016x系列运放:高性能与多应用的完美结合

    作为电子工程师,在日常设计工作中,选择合适的运算放大器(op amp)至关重要。今天就来和大家详细探讨onsemi的NCS20161、NCS20162、NCS20164以及对应的NCV系列运算放大器,它们在性能和应用上都有很多值
    的头像 发表于 12-03 13:52 513次阅读
    深入解析onsemi <b class='flag-5'>NCS</b>2016x系列运放:高性能与多应用的完美结合

    深入解析OnSemi NCS21673/4系列电流检测放大器

    在电子工程师的日常设计工作中,电流检测是一个至关重要的环节,它直接关系到电路的性能和稳定性。今天,我们就来深入探讨一下OnSemi推出的NCS21673、NCV21673、NCS21674和NCV21674系列电流检测放大器,看看它们有哪些独特的优势和应用场景。
    的头像 发表于 12-02 13:43 556次阅读
    深入解析OnSemi <b class='flag-5'>NCS</b>21673/4系列电流检测放大器

    使用NucleiStudio_IDE编译程序,下载到外挂的flash,如果我更改了外部flash的型号或者大小,需要修改什么内容呢?

    使用NucleiStudio_IDE编译程序,下载到外挂的flash,如果我更改了外部flash的型号或者大小,需要修改什么内容呢?
    发表于 11-06 07:34

    NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒

    NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒 本文章主要是讲解NCS下面使用nRF54L15如何进入system_off模式,以及如何配置通过按键唤醒 一、如何进
    的头像 发表于 09-29 00:56 940次阅读
    【<b class='flag-5'>NCS</b>随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒

    NCS随笔】NCS使用CJSON库

    NCS随笔】NCS使用CJSON库 这个文章讲一下在NCS上面如何使用JSON库,我使用Hello_world例程添加库 宏的配置 CONFIG_LOG =y
    的头像 发表于 08-13 15:12 750次阅读
    【<b class='flag-5'>NCS</b>随笔】<b class='flag-5'>NCS</b>使用CJSON库

    NCS放大器DAD3350使用效果

    NCS放大器DAD3350在使用效果上展现出显著优势,具体体现在以下几个方面: ‌ 一、信号增强与稳定性提升 ‌ ‌ 精准信号放大 ‌ NCS放大器DAD3350能够将输入信号的电压或功率有效放大
    的头像 发表于 07-12 09:36 835次阅读

    NCS放大器DAD3350使用场景与效果

    NCS放大器DAD3350使用场景与效果 ‌ ‌ 使用场景 ‌ ‌ 半导体切割设备 ‌ ‌ 核心应用 ‌:NCS放大器DAD3350是DISCO DAD3350切割机的关键组件,用于信号放大,确保
    的头像 发表于 07-12 09:34 902次阅读

    NCS放大器DAD3350详细信息

    NCS放大器DAD3350详细信息 ‌ ‌ 产品概述 ‌ ‌ 型号 ‌:DAD3350 ‌ 品牌 ‌:NCS ‌ 应用领域 ‌:主要用于半导体划片机(如DISCO DAD3350系列)的信号放大
    的头像 发表于 07-12 09:31 946次阅读

    Android14在BLE中,当MTU超过 517时,如何处理数据传输?

    /behavior-changes-all#mtu-set-to-517 我们在应用更改后进行了测试,但遇到了无法传输超过 512 字节数据的问题。 由于客户的工作数据通常超过 512 字节,我们预计需要分割数据进行传输。 在分段传输
    发表于 07-01 06:56

    NCS怎么添加.c.h文件到工程

    NCS随笔】 SEGGER添加方式 在介绍NCS工程之前,我们先看看大家熟悉的SEGGER工程(Keil同理): 左边的项目栏可以看到工程的配置,通过点击 User Include
    的头像 发表于 06-27 14:48 1190次阅读
    <b class='flag-5'>NCS</b>怎么添加.c.h文件到工程

    PDL电台设置更改操作流程

    电子发烧友网站提供《PDL电台设置更改操作流程.pdf》资料免费下载
    发表于 06-04 16:46 29次下载

    更改最大数据包大小时无法识别USB设备如何解决?

    将生产者 EP 端点描述符中的最大数据包大小从 1024 字节更改为 512 字节时,无法识别 USB 设备。 请告知如何解决这个问题。
    发表于 05-20 08:13

    nRF Connect SDK(NCS)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级

    如何在nRF Connect SDK(NCS)中实现蓝牙空中升级?MCUboot和B0两个Bootloader有什么区别?MCUboot升级使用的image格式是怎么样的?什么是SMP协议?CBOR
    的头像 发表于 05-09 14:14 3898次阅读
    nRF Connect SDK(<b class='flag-5'>NCS</b>)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级