Thread 中讨论的其他器件: CC2541
工具与软件:
你好
我´m 根据设置为 Central 的基本 BLE 工程(在 syscfg 文件中)开发一个应用、并´m 使用 simplelink_lowpower_f3_sdk_8_10_01_02中提供的示例。
以下实现已完成并按预期运行:
*连接处理-好
*服务发现-好的
*特征及其描述符发现-好的
* CCCD 发现-好的
*菜单模块选项和功能启用/禁用指示已创建-确定
*注册 BLEAPPUTIL_ATT_Handle_Value_IND 事件 -确定
我需要连接的外设有2个表示的特性集和1个设置为写入。 到目前为止、一切都运行得很好。
因此、在连接并发现上述所有特性后、我继续手动开启这两个特性之一的指示、结果是中央设备开始 按预期接收 ATT_Handle_Value_IND 通知。 我看到 Central 接收到的有效载荷数据是完美的。
起初、Central 仅接收第一个通知、而不接收第二个通知。 然后、我了解到中心需要在接收到指示数据后发回确认、因此我向函数 ATT_HandleValueCfm (gattMsg->connHandle)添加了一个调用;
完成此操作后、我的中心设备开始不断地接收指示、并且始终具有更新的数据。 但是、几秒钟后、指示事件 会停止、并且 ATT_FLOW_CTRL_COVERSE_EVENT 会发生。
这是访问通知数据并调用 ATT_HandleValueCfm 函数的事件代码片段。
case ATT_HANDLE_VALUE_IND: { MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE1, 0, "Indication length= %d", gattMsg->msg.handleValueInd.len); MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE2, 0, "DATA BYTES = 0x%02x, 0x%02x, 0x%02x", gattMsg->msg.handleValueInd.pValue[0], gattMsg->msg.handleValueInd.pValue[1], gattMsg->msg.handleValueInd.pValue[2]); pesoBruto=gattMsg->msg.handleValueInd.pValue[6]<<24; pesoBruto|=gattMsg->msg.handleValueInd.pValue[5]<<16; pesoBruto|=gattMsg->msg.handleValueInd.pValue[4]<<8; pesoBruto|=gattMsg->msg.handleValueInd.pValue[3]; MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE3, 0, "PESO BRUTO = %ld", pesoBruto); //ClockP_usleep(100000); // vTaskDelay( 1000 ); ATT_HandleValueCfm(gattMsg->connHandle); break; }
我n´t 增加各种延迟、但我不知道这是否正确。 当我取消注释这两条延迟线(ClockP_usleep(10000);或 vTaskDelay(100 );)时,流控制违规不再发生,但指示事件仍会在几秒钟后停止。
下面是几个问题:
1) ATT_HandleValueCfm (gattMsg->connHandle)是否是确认指示的正确方法?
2) 2)如果是、这是否是调用它的正确位置? (在处理完有效载荷数据后的事件处理程序内部)
3)这些延迟在这个地方是一件好事? (在处理完有效载荷数据后的事件处理程序内部)
提前感谢您