你好,
我正在研究一个项目,其中芯片的默认状态是延长睡眠模式。在接收到一个低信号gpio中断时,芯片唤醒,发布5个数据包。在此之后,设备切换到扫描模式。现在,当设备接收到一个发布报告时,它切换到发布模式发布接收到的数据包,发布后,切换回扫描。这个过程一直持续到设备发送了5个BLE报文。与此同时,我在app_wakeupcb()中启动了一个uart2_read()操作。现在,在第5个包的发布之后(即设备处于外设/发布模式),uart数据被检查,如果收到任何数据,该数据就从设备发送。这个流程很好。
现在,另一方面,如果没有收到广告报告(例如,角色转换没有发生),在scanning_completed()调用(10 s后扫描超时自通用发现模式扫描使用),角色转换到阿德模式启动,uart数据检查,如果收到任何数据,这些数据从设备发送。当我使用断点验证代码流时,代码流工作得很好。但是,该设备不会发送任何广告。在启动每个发布启动命令后,我将调用一个50ms定时器来取消发布。流甚至到达这个错误状态为GAP_ERR_CANCELED的回调。为什么会发生这种情况?
代码片段如下:
空白scanning_completed (uint8_t状态)
{
如果(状态= = GAP_ERR_TIMEOUT) {
user_app_configuration_func (GAP_PERIPHERAL_SLV);
}
}
空白user_app_configuration_func (uint8_t角色)
{
struct gapm_set_dev_config_cmd* cmd = KE_MSG_ALLOC
(
GAPM_SET_DEV_CONFIG_CMD,
TASK_GAPM TASK_APP,
gapm_set_dev_config_cmd
);
//设置设备配置
cmd - >操作= GAPM_SET_DEV_CONFIG;
/ /设置角色
cmd - >角色=角色;
memset (cmd - >惹恼。Key, 0, sizeof(struct gap_sec_key));
cmd - >外观= 0;
cmd - > appearance_write_perm = GAPM_WRITE_DISABLE;
cmd - > name_write_perm = GAPM_WRITE_DISABLE;
ke_msg_send (cmd);
返回;
}
Void user_app_on_set_dev_config_complete(Void)
{
send_uart_status ();
}
空白send_uart_status (void) {
struct gapm_start_advertise_cmd * cmd;
cmd = app_easy_gap_non_connectable_advertise_get_active ();
memset (cmd - > info.host.adv_data 0 28);
memset (cmd - > info.host。adv_data 0 28);
cmd - > info.host。adv_data_len = 28;
memcpy (cmd - > info.host。adv_data header_data, sizeof (header_data));
memcpy (& (cmd - > info.host.adv_data [4]), sample_data, sizeof (sample_data));
app_easy_gap_non_connectable_advertise_start ();
handle_50ms_timer timer_50ms = app_easy_timer(5日);
}
空白handle_50ms_timer(空白)
{
+ + no_of_uart_pkts_sent;
app_easy_gap_advertise_stop ();
}
空白user_app_adv_nonconn_complete (uint8_t状态)
{
如果(no_of_uart_pkts_sent < 5) {
send_uart_status ();
}
其他{
no_of_uart_pkts_sent = 0;
go_to_sleep ();
}
}
空白go_to_sleep(空白)
{
arch_set_sleep_mode (ARCH_EXT_SLEEP_ON);
arch_ble_ext_wakeup_on ();
//配置唤醒按钮
app_button_enable ();
}
控制与预期一致。
Ie,在10秒超时后,控制到达scaning_completed(),在设备配置成功完成时,到达send_uart_status()。
当no_of_uart_packets_sent计数变为5时,设备也进入go_to_sleep()。
但广告似乎不出芯片,当我验证使用嗅探。
请尽早提出原因和解决办法,因为这阻碍了我们的进一步发展。
谢谢
Wisilica
嗨wisilica,
如果我得到你的正常情况,纠正我如果我错了,有一种情况在切换角色从中央到边缘(当没有广告包收到设备时操作中心)发出开始宣传命令和您没有看到广告包从外围设备操作时,相反,您会得到一个广告完全回调,当前广告过程已被取消。我看不出任何明显的原因,这发生除非你正在调用取消命令取消50毫秒定时器回调之前的广告过程,你将不得不试验你的设置,以找出为什么会发生这种情况,例如,你可以从下面的实验开始,如果你没有设置50毫秒的定时器来取消广告,或者如果你设置了一个更大的定时器,这有相同的效果吗?你还是不能看到设备广告吗?您仍然会得到完成回调吗?以什么身份?
我还认为,启动和停止广告过程的原因是因为您想计数广告事件,并基于已发射的数据包行为。建议有一种更有效、更直接的方法来实现这一点,而不是启动和停止广告过程,请检查user_on_ble_powered()回调中的信标示例,您可以使用它来计算广告事件(该功能检查最后一个BLE事件是否是BLE_EVT_END,如果它是行为,那么您可以增加一个计数器来测量广告事件)。您还可以在user_on_ble_powered()中轮询计数器的状态,并在此时附加一个功能。
由于MT_dialog