GAP_OBSERVER_MODE的中央扫描停止工作

5个职位/ 0个新
最后发表
Vadym
离线
最后看到:2个月前1年
加入:2015-08-13 08:28
GAP_OBSERVER_MODE的中央扫描停止工作

嗨对话框支持。

我使用SDK 5.0.3的DA14580设备..设备工作在中央扫描模式,应该报告所有的广告消息。设备始终处于运行模式,不进入任何睡眠模式。

一段时间后,申请停止接收广告报告。
我对每个报告使用IO切换来确定这种情况。我没有成功地找到问题的原因,因为任何断点或调试暂停导致返回正常操作。
造成这个问题的重要原因是当前任务的缺席中断。
当我使用空句柄时使用计时器 - 这会修复问题。
我发现了一些我认为相同的东西:
https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...

你能帮我了解一下情况吗?

报表功能为:
void app_adv_report_ind_func(struct gapm_adv_report_ind const * param)

GPIO_SetActive(ORANGE_LED_PORT, ORANGE_LED_PIN);

__nop ();
__nop ();
__nop ();
__nop ();
GPIO_SetInactive(ORANGE_LED_PORT, ORANGE_LED_PIN);
返回;

扫描参数如下:

静态const struct scan_configuration
/ / /操作的代码。
.code = GAPM_SCAN_PASSIVE,
///设备自带BD地址源
.addr_src = GAPM_PUBLIC_ADDR,
/ /扫描间隔
.interval = APP_SCAN_TIME_WINDOW_MS,
//扫描窗口大小
.window = app_scan_time_window_ms,
/ / /扫描模式
.mode = GAP_OBSERVER_MODE,
///扫描过滤策略
.filt_policy = SCAN_ALLOW_ADV_ALL,
///扫描副本过滤策略
.filter_duplic = scan_filt_duplic_dis.
};

设备:
MT_dialog
离线
最后看到:2个月1周前
工作人员
加入:2015-06-08 34
嗨Vadym,

嗨Vadym,

首先,你不需要从一个void函数返回,除了因为你是在观察者模式扫描,除非你取消操作扫描不会停止(所以检查你是否正在取消扫描在某个点)。如果你得到广告报告或没有你确定这是检查led开关?我问,因为闪烁会发生太快,看不到任何东西,然而,你可以检查如果你得到广告指示或通过打印一个指示(确保它很短,因为打印太多的数据可能导致重置由于过多的内存分配,因为你也印刷的过滤重复禁用),如果你有一个专业开发工具可以检查该设备是否扫描,你可以把arch_set_pxact_gpio .app_on_adv_report_ind回调()函数,检查如果光标出现在电源分析器。还要确保你要追踪的设备确实是在做广告。

我不明白你使用了什么样的计时器,问题是解决的,如果你能提供一些额外的细节,我将能够理解发生了什么。

由于MT_dialog

Vadym
离线
最后看到:2个月前1年
加入:2015-08-13 08:28
你好亲爱的支持。

你好亲爱的支持。

1.从虚空中归来:你是绝对正确的。它仍然来自真实的项目代码,它不应该干扰功能的执行。
2.根据LED闪烁你绝对是对的。我使用的不是真正的LED,而是一个与引脚相连的示波器。如果你注意到,我并没有抱怨它不工作。
3.我没有专业开发工具。
4.我的空间中至少有5-10个BLE设备每100毫秒做一次广告。
5.我没有看到我使用GAPM_RESET_CMD或GAPM_CANCEL_CMD。添加计时器后,设备不会停止运行。
6.我用空体使用了计时器。使用计时器,设备不会停止接收广告报告。
我还注意到,当接收挂起时,我在UART中询问某些内容(在实际项目中我有UART通信,例如Keepalive命令),设备返回正常操作。添加任何断点到代码也将设备返回正常操作 - 这是调试非常困难,这是一个原因,我用IO来了解发生的内容。

我用了空的定时器。当我使用定时器时,设备不会停止接收广告报告。
计时器使用:
ke_msg_id_t const msgid,
Const struct app_led_indication_evt *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

ke_timer_set(app_led_indication_timer,task_app,1000);
返回(KE_MSG_CONSUMED);

问候,Vadym。

Vadym
离线
最后看到:2个月前1年
加入:2015-08-13 08:28
在额外的地方,我错了

另外,我错误地按下了网站按钮“接受这个答案”。如果你觉得答案有用,请按此连结”。
现在,我不能取消这次手术。通常情况下,都有取消操作或确认方式的问题。
谢谢。

MT_dialog
离线
最后看到:2个月1周前
工作人员
加入:2015-06-08 34
嗨Vadym,

嗨Vadym,

抱歉,没有办法撤销接受的答案。

关于你的问题,我无法找到你有一个空计时器的事实之间的任何关系,这可以防止设备停止报告被扫描的广告字符串,这似乎有点奇怪,即使设备停止扫描一些点和计时器当它命中时,它应该触发一个函数,以便开始设备再次开始扫描,你有任何其他设备要测试吗?至少在我的一边,我可以测试观察者模式,我没有看到它停止(当您看到设备不再报告时有时间限制了吗?例如,特定金额为秒或几分钟甚至几小时?)。如果您发现FW停止报告广告字符串,我怀疑设备出于某种原因它停止扫描,因为您没有Pro套件以附加智能片段(这将有助于调试这样的事情),我会检查设备是否扫描,以便每次都有一个Rx中断时可以切换GPIO,所以通过应用下面的片段,您将能够跟踪BLE扫描的每个结束:

uint8_t app_last_ble_event;

enum arch_main_loop_callback_ret user_on_ble_powered(空白)

uint8_t temp_last_ble_event;

temp_last_ble_event = arch_last_rwble_evt_get ();

如果(app_last_ble_event ! = temp_last_ble_event)


app_last_ble_event = temp_last_ble_event;
if (app_last_ble_event == BLE_EVT_END)
ARCH_SET_PXACT_GPIO();


返回goto_sleep;

还要跟踪app_on_scanning_complete回调,并检查它是否在某个点被调用。

由于MT_dialog