我的 1_35_00_33 simplelink SDK 中的 simple_ob观测 器_cc2640r2lp_app 存在一些可靠性问题。 我正在尝试从 每100mSec 发送一次的外设设备捕获所有广播数据包(另一个运行 Project_Zero 应用程序的 CC2640R2 LaunchXL)。 外设 器件在其广播数据中包含一个计数器、该计数器在发送每个 ADV 数据包时递增。 我正在检查观测器代码中的数据、大约缺少10%的数据。 当我使用 TI 数据包监听器检查 BLE 流量时、我可以看到从外设发送的所有 ADV 数据包、其中没有缺失、因此问题似乎不出在外设器件中。 我已修改 GAP_DEVICE_INFO_EVENT、以将事件过滤为仅与我感兴趣的地址匹配的事件、并检查 mfr 中的计数器。 ADV 数据包的区域是连续的、这表示我没有错过一个数据包。 代码和典型输出如下所示。 我将 DEFAULT_SCAN_DURATION 设置为0以无限期扫描、 将 DEFAULT_MAX_SCAN_RES 设置为8。 我还设置了一些其他 GAP 参数、如下所示...
//EC -根据 e2e.ti.com/.../345382将扫描占空比设置为100%
GAP_SetParamValue (TGAP_GEN_DISC_SCAN_INT、16);
GAP_SetParamValue (TGAP_GEN_DISC_SCAN_WING、16);
//EC -请勿按设备地址过滤... 允许应用程序接收所有 ADV 数据包
GAP_SetParamValue (TGAP_FILTER_ADV_REPORTS、false);
我认为这可能是扫描窗口/间隔或时间问题,但我不确定如何解决问题,而不是尝试和错误...任何帮助解决这一问题都是非常感激的。
静态空 SimpleBLEObserver_processRoleEvent (gapObserverRoleEvent_t *pEvent)
{
uint8_t EVENT_addr[B_ADDR_LEN];//!<广播或 SCAN_RSP 的地址
uint16_t advDataDifference = 0;
uint32_t currentTicks = 0;
switch (pEvent->gap.opcode)
{
案例 GAP_DEVICE_INIT_DONE_EVENT:
{
//Display_print0 (dispHandle、1、0、Util_convertBdAddr2Str (pEvent->initDone.devAddr));)
//Display_print0 (dispHandle、2、0、"已初始化");
//提示用户开始扫描。
//Display_print0 (dispHandle、5、0、"Discover ->");
}
中断;
案例 GAP_DEVICE_INFO_EVENT:
{
//SimpleBLEObserver addDeviceInfo (pEvent->deviceInfo.addr、pEvent->deviceInfo.addType);
advTotEvntCnt++;
memcpy (event_addr、pEvent->deviceInfo.addr、B_ADDR_LEN);
currentTicks = Clock_getTicks ();
//检查地址是否与我们的 matchBuf 模式匹配,因此我们知道它是我们的 BLE 设备之一
if (memcmp (&event_addr[B_ADDR_LEN-ADV_ID_MATH_LEN]、&matchBuf[B_ADDR_LEN-ADV_ID_MATH_LEN]、ADV_ID_MATH_LEN)==0)
{
advFiltEvntCnt++;
//将节拍和 mfr ADV 数据存储到缓冲区中以进行离线检查/调试。 外等式提前计数器、单位为 mfr。
//每个 ADV 数据包的 ADV 数据、当它达到1000时、它回绕到0。
advFiltEvntTicks[advDataBufIndex]=电流 Ticks;
memcpy (&advFiltEvntData[advDataBufIndex]、pEvent->deviceInfo.pEvtData + 6、sizeof (uint32_t));
//检查广播数据是否是顺序的...如果没有错过日志#,则检查0会在缓冲区换行时忽略,因此不准确,但足够接近
if (advFiltEvntData[advDataBufIndex]>0)
{
advDataDifference = advFiltEvntData[advDataBufIndex]- advFiltLastData;
if ((advDataDifference > 1)&&(advFiltEvntCnt > 1))
{
advFiltMisedEvntCnt += advDataDifference - 1;
}
}
advFiltLastData = advFiltEvntData[advDataBufIndex];
advDataBufIndex =(advDataBufIndex < ADV_DATA_BUF_LEN)? advDataBufIndex++:0;
}
//每10秒输出性能数
if (currentTicks - startTicks > 1000000)
{
startTicks = currentTicks;
advFiltMisedEvntPct =((float) advFiltMisedEvntCnt /(float) advFiltEvntCnt)*100;
Display_Print1 (dispHandle、1、0、"时间戳记数:%d "、currentTicks);
Display_Print1 (dispHandle、2、0、"Total Event Count:%d"、advTotEvntCnt);
Display_Print1 (dispHandle、3、0、"过滤事件计数:%d"、advFiltEvntCnt);
Display_Print1 (dispHandle、4、0、"错过的事件计数:%d "、advFiltMisedEvntCnt);
Display_Print1 (dispHandle、5、0、"错过的事件百分比:%d"、advFiltMisedEvntPct);
advTotEvntCnt = 0;
advFiltEvntCnt = 0;
advFiltMisedEvntCnt = 0;
}
}
中断;
案例 GAP_DEVICE_DISCOVERING_EVENT:
{
//发现完成。
扫描=错误;
//复制结果。
scanRes = pEvent->disccmpl.numDevs;
memcpy (devList、pEvent->discCmpl.pDevList、
(sizeof (gapDevRec_t)* pEvent->discCmpl.numDevs));
Display_Print1 (dispHandle、2、0、"找到的设备%d"、scanRes);
如果(scanRes >0)
{
Display_print0 (dispHandle、3、0、"<- to Select");
}
//初始化扫描索引。
scanIdx =-1;
//提示用户可以在此状态下重新执行扫描。
Display_print0 (dispHandle、5、0、"Discover ->");
}
中断;
默认值:
中断;
}
谢谢、
ED