GAP_OBSERVER_MODE中的中央扫描停止工作

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

嗨对话框支持。

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

一段时间后,申请停止接收广告报告。
我对每个报告使用IO toggle来确定这种情况。我没有成功找到故障的原因,因为任何断点或调试暂停都会导致恢复正常运行。
导致此问题的重要原因是当前任务没有中断。
当我使用带有空句柄的计时器时 - 这会修复问题。
我也发现了同样的东西
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);
返回;

扫描参数如下:

Static const struct scan_configuration user_scan_conf ={
/ / /操作的代码。
.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
离线
最后看到:3个月1个星期前
工作人员
加入:2015-06-08 34
嗨Vadym,

嗨Vadym,

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

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

由于MT_dialog

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

你好亲爱的支持。

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

我用空身体计时。当我使用定时器时,设备不停止接收广告报告。
计时器使用:
Int app_led_indication_handler(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
离线
最后看到:1年3个月前
加入:2015-08-13 08:28
额外的,我错误地

另外,我错误地按下了网站按钮“接受这个答案”。如果你觉得答案有用,请点击这个链接。
现在,我不能取消这次手术。通常,有办法取消操作或确认问题。
谢谢。

MT_dialog
离线
最后看到:3个月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