我们已经创建了一个具有2个特征的固件(读/通知和写)。您可以使用write(带响应)特征发送命令,并使用read特征获取结果。为了通知读特征包含响应,发送一个通知。
当从PRO DEVKIT运行在电池模式下一切工作顺利。
如果我们连接一个USB智能手机充电器,并尝试在这种情况下做同样的事情,有时通知不能到达目的地,即使它们显然已经发送(ble_gatts_send_event返回成功,而BLE_EVT_GATTS_EVENT_SENT显示正确)。
大约5秒内,写/通知/读事件约为10个。通常最后一个命令是没有得到通知的。
任何想法?
问候,
N
设备:
嗨nhan.ngodinh,
我看不出从电池供应设备,然后直接从USB可能会影响通知的发送,这没有明显的原因,你有嗅探日志,以验证发送的数据包数量的空气?你确定你得到的问题是与使用电池或当VBUS插入时有关吗?
由于MT_Dialog
不幸的是,没有可用的嗅探日志。我确认问题正在按我描述的方式发生。
我找到了一个解决方案,错误的命令序列是(简化):
ble_storage_put_buffer(conn_idx, response_h, length, buf, OS_FREE_FUNC, false);
ble_storage_get_u16 (conn_idx ccc_h, ccc);
if (ccc & GATT_CCC_NOTIFICATIONS) {
ble_gatts_send_event(conn_idx, response_h, GATT_EVENT_NOTIFICATION, sizeof(notify_body), ¬ify_body);//当VBUS应用时,有时不工作
}
我创建了一个解决方案,在ble_storage_put_buffer()之后立即添加一个无用的ble_storage_get_buffer(),其简化的序列如下:
ble_storage_put_buffer(conn_idx, response_h, length, buf, OS_FREE_FUNC, false);
ble_storage_get_buffer(conn_idx, response_h, &dummylength, &dummybuf, OS_FREE_FUNC, false);//虚拟读取(workaround)
ble_storage_get_u16 (conn_idx ccc_h, ccc);
if (ccc & GATT_CCC_NOTIFICATIONS) {
ble_gatts_send_event(conn_idx, response_h, GATT_EVENT_NOTIFICATION, sizeof(notify_body), ¬ify_body);
}