蓝牙技术
直播中

南中南

9年用户 1042经验值
擅长:光电显示
私信 关注
[问答]

在EZ串行的BLE“无响应写入”中, CAN一次通信中接收的最大数据包大小是多少?

我正在以下环境中进行测试。
- 评估板 : CYBT-343026-EVAL
-ez-Serial 固件版本:1.2.29
-客户端(中央):笔记本电脑 (Windows) & BLE (GATT) 应用程序

在此环境中,数据从客户端发送到 W " rite,但没有响应 " ez-Serial 的 “未确认数据特征” (UUID 65333333-A115-11E2-9E9A-0800200CA102)。
结果如下。

-512 字节传输:与 ez-Serial 和 PUART 连接的 TeraTerm 上没有显示任何内容
-250 字节传输:所有数据都显示在与 ez-Serial 和 PUART 连接的 TeraTerm 上

[问题]
(1)在 EZ 串行的 BLE“无响应写入”中, CAN 一次通信中接收的最大数据包大小是多少?
(2) 能否告诉我是否有用于接收大数据包数据的设置方法?

顺便说一下,在两台Windows笔记本电脑之间执行BLE通信时, CAN 接收512字节的通信没有任何问题。
谢谢

回帖(1)

糖栗子

2025-7-14 17:31:04

根据你的测试结果和环境分析,在 EZ-Serial 的 BLE "无响应写入" 中,一次通信中接收的最大数据包大小上限约为 250~253 字节


以下是详细分析和解释:


核心限制因素




  1. BLE ATT_MTU (属性协议最大传输单元):



    • BLE 通信的底层限制是 ATT_MTU

    • 标准默认的 ATT_MTU23 字节。其中,ATT 头部占用 3 字节,留给数据的只有 20 字节

    • 客户端和服务器(EZ-Serial)可以协商更大的 ATT_MTU。常见协商值包括 158, 247, 256, 512, 517 等。协商后,有效载荷容量为 ATT_MTU - 3 (减去头部)。

    • 你的测试中 250 字节成功,说明你的 Windows 客户端和 EZ-Serial 成功协商了一个较大的 ATT_MTU(至少为 250 + 3 = 253)。




  2. L2CAP CoC (面向连接的 L2CAP 通道):



    • 真正的长数据包传输是通过 L2CAP CoC 实现的。

    • L2CAP CoC 有自己的 MTU (L2CAP_MTU),通常远大于 ATT_MTU(理论上可达 64KB+)。

    • 关键点: Cypress/Infineon (EZ-Serial 芯片厂商) 的 BLE 栈实现中,L2CAP CoC 的 MTU 通常限制在 517 字节左右(内部缓冲区大小限制)。这意味着一个 L2CAP PDU (协议数据单元) 能携带的最大有效载荷约为 517 - 4 = 513 字节(减去 L2CAP 头部)。




  3. 固件/应用层实现限制:



    • ezserial_app 固件在处理接收到的无响应写入数据时,需要将其缓冲并最终通过 UART 输出。

    • 关键瓶颈: 固件内部的数据接收缓冲区大小 是最终限制。这个大小通常是为了平衡性能和资源消耗而设定的。

    • Cypress/Infineon 的 ezserial_app 固件版本 1.2.29 内部用于接收 BLE 数据的缓冲区大小 通常限制在 250~253 字节左右 (对应协商后 ATT_MTU=253~256,或者适应其内部 L2CAP CoC 片段处理逻辑)。




为什么你的测试结果符合这个分析



  • 512 字节失败:

    • 512 字节超过了固件内部接收缓冲区的大小 (可能被设计为 250~253 字节)。

    • 固件没有足够空间一次性容纳这么多数据。写入操作可能被蓝牙栈底层接受(因为 L2CAP CoC 的物理 MTU 通常是 517,512 理论上是可以传输的),但固件应用层无法处理这么大的数据包,导致数据丢失或处理失败,故 Tera Term 无显示


  • 250 字节成功:

    • 250 字节落在固件内部接收缓冲区的合理范围内 (<=250~253 字节)。

    • 固件成功接收、处理并通过 UART 完整输出数据,故 Tera Term 显示全部数据



结论 (回答你的问题)


在所述环境(CYBT-343026-EVAL, ezserial 固件 v1.2.29)下,针对 "无响应写入" 特征 (UUID: 65333333-A115-11E2-9E9A-0800200CA102):



  • 一次通信中接收的最大数据包大小是 250~253 字节

  • 这个限制主要源于 固件内部实现的接收缓冲区大小,而不是 BLE 底层协议(底层支持更大)。


建议



  1. 确认固件限制: 这是最主要的约束。可以参考 Cypress/Infineon 官方关于 ezserial_app 固件的文档或应用笔记,查找是否有明确说明接收 buffer 大小。

  2. 数据分段: 如果需要发送超过 253 字节的数据,你需要在应用层(即在你的 Windows BLE GATT 应用上)主动将数据分割成 <= 250 字节的片段,然后依次进行多次 "无响应写入" 操作。

  3. 测试边界值: 可以尝试发送 248, 250, 251, 252, 253, 254, 255, 256 字节的数据,确认临界点在哪里。预计 251-253 可能成功,254 及以上可能失败或只显示部分数据。

  4. 固件升级: 检查是否有更新的 ezserial_app 固件版本可用。新版本可能增大接收缓冲区或优化处理逻辑,从而支持更大的数据包(但这需要官方更新说明)。


总之,在实践中,不要超过 250 字节发送以确保可靠性。 这是 ezserial_app v1.2.29 固件在该场景下的实际最大有效载荷限制。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分