125K(LE Coded S=8)下还是走 DLE 的同一套规则:
tx_octets
的上限依然是 251(LL 层单包最大负载)。tx_time
是“单包最大发送时长(us)”,需要按所用 PHY 的比特率估算。
一个好用的近似公式(够工程使用):
tx_time(µs) ≈ (tx_octets + 14) * 8 / R ,R 为 Mbps(1M=1,2M=2,500K=0.5,125K=0.125)
“+14”是 LL 层头部等开销的常用近似。
以 tx_octets=251 估算得到常用值(四舍五入):
PHY | 估算 tx_time |
---|---|
1M | ≈ 2120 µs |
2M | ≈ 1060 µs |
125K(S=8) | ≈ 16960 µs |
500K(S=2) | ≈ 4240 µs |
你的需求:想一次发送 512 字节
- LL 层单包最多 251B,所以 必须分成两包(DLE 只是把单包上限提到 251B)。
- 若想在 ATT 层“一次性”写 512B,还需要 把 MTU 提到 ≥517(ATT 可载荷=MTU-3=512B),底层依然会拆成两包 LL PDU 发送。
125K(S=8)下的调用示例
gap_ll_pkt_size_exchange_req_t req = {
.conidx = 0, // 你的连接索引
.tx_octets = 251, // LL 单包最大负载上限
.tx_time = 16960, // 125K 估算值(微秒)
};
ble_api_err_t err = gap_ll_pkt_size_exchange_req(&req);
if (err != BLE_API_OK) {
// 处理错误
}
实战提示
- 有的控制器会自己协商到双方都能接受的最大值;
tx_time
宁可略大不要偏小,125K 下给 17000~18000 µs 也常见。- 记得在建立连接后:先做 ATT MTU 交换(≥517)→ 再做 DLE(251/16960),最后再发 512B 的应用数据。
- 若用 500K(S=2),把
tx_time
改成 ≈ 4240 µs 即可,tx_octets
仍为 251。