14个员额/0个新员额
最后发表
lewuyouc
离线
最后看到:2年1周前
加入:2016-07-18 01:38
蓝牙断开连接

你好!
我参考的是官方例程prox_report

1 .请问DA14580如何主动断开连接,调用那个函数?调用default_app_on_disconnect (NULL)似乎不对。

2 .请问DA14580和手机APK连接之后,人为关闭手机蓝牙,使手机APK和DA14580异常断开,DA14580一直没收到断开消息,没有广播,无法再次
和DA14580连接,只有断电重启才能连接,请问该如何处理吗?

关键词:
设备:
CYibin
离线
最后看到:10个月,3个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

首先,确保 prox_记者工程没有做过任何修改。以下是功能的实现示例

1.外设端主动断开蓝牙

/ / 1。在user_proxr.c中,创建一个用户层连接成功的回调函数,把链路索引保存下来uint8_t connect_idx;无效的连接上的用户应用程序(uint8连接idx,结构体gapc_connection_req_ind常数*参数){connect_idx = connection_idx;default_app_on_connection (connection_idx参数);}/ / 2。在user_proxr.h中声明无效的连接上的用户应用程序(uint8连接idx,结构体gapc_connection_req_ind常数*参数);// 3. 把连接成功函数注册到 回拨列表,在 用户\回调\配置.h中:.app_on_connection = user_app_on_connection,/ / 4。调用API实现主动断开应用程序\u轻松\u间隙\u断开(连接\u idx);

2.系统蓝牙链路断开后,会调用:

user_app_on_disconnect

2.

lewuyouc
离线
最后看到:2年1周前
加入:2016-07-18 01:38
你好, 赛宾

你好, 赛宾

我在prox_report做了如下修改:

添加支持拱门印刷厂
修改广播参数:
user_default_hnd_conf参数修改如下
.adv_scenario = DEF_ADV_FOREVER,。advertise_period = MS_TO_TIMERUNITS (18000),
用户\u adv\u conf参数修改如下:
.intv_最小值=160,.intv_最大值=160,
关闭BLE_SPOTA_RECEIVER / / / / / / # define BLE_SPOTA_RECEIVER 1
关闭BLE#U PROX#U REPORTER定义使用按钮0////0定义BLE#U PROX#U REPORTER 1

我需要在连接断开后一直广播,在人为关闭手机蓝牙后,DA14580会调用user_app_on_disconnect,然后广播。但是

在重复多次打开关闭手机蓝牙后,DA14580广播有时断断续续广播,我如上修改广播参数是否正常,还需要修改别的吗?

另外还有一个问题请提供帮助,DA14580支持硬延时吗,我使用IIC接口的传感器,传感器初始化伪代码如下:

空隙传感器_init(空隙)

Sensor_reset() //必须延迟3ms, next sensor_standby()

adc_usDelay(3000);

传感器_备用()//必须延迟2ms,下一次设置传感器控制();

adc_usDelay (2000);

sensor_control1 ();

adc_usDelay (2000);

sensor_control2 ();

adc_usDelay (2000);

请问我应该如何处理延时?延时时间多,似乎使系统不稳定,请问我该如何处理?sensor_init();应该在何处调用吗?

如果使用app_easy_timer,延时最低单位是10毫秒,因为延时次数较多,有没有更好的方法?

CYibin
离线
最后看到:10个月,3个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

你广播参数没问题,如果程序没做任何修改的话,不会出现你所说的广播断断续续的现象的。出现这个现象,怀疑是:

1.硬件问题,有频偏或者天线没设计好或者晶振的参数不符合数据表的要求

2.软件问题,SDK是一套消息机,制程序里不能有阻塞

传感器初始化等硬件的初始化可放user_on_app_init回调函数里,可在user_callback_conifg.h中找到该接口。

你可以通过 而(我--)的方式来实现延时

lewuyouc
离线
最后看到:2年1周前
加入:2016-07-18 01:38
你好,请问user_on_app_init

你好,请问user_on_app_init和system_init先后顺序是那个吗?测试发现user_on_app_init似乎在system_init前调用。

如果传感器传感器init放在user_on_app_init,但是i2c_init放在system_init中的periph_init函数中。

只有先i2c_init才能传感器初始化我记得应用程序初始化上的用户似乎是初始化一些参数变量,也能初始化传感器是吧?

CYibin
离线
最后看到:10个月,3个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

user_on_app_init在system_init中调用:

如果(user_app_main_loop_callbacks。app_on_init ! = NULL)
user_app_main_loop_callbacks.app_on_init ();

lewuyouc
离线
最后看到:2年1周前
加入:2016-07-18 01:38
你好,根据你的描述是能够主动断开连接,请问断开连接后

你好,根据你的描述是能够主动断开连接,请问断开连接后,发现ke_state_get (TASK_APP) = = APP_CONNECTED,请问这正常吗,断开连接,停止广播ke_state_get (TASK_APP)不应该是APP_CONNECTABLE吗?

CYibin
离线
最后看到:10个月,3个星期前
工作人员
加入:2017-12-14 02:48
不正常。

不正常。

断开后,正常应该会调用开启广播的函数。然后把 应用程序任务的状态设置为:

ke_state_set (TASK_APP APP_CONNECTABLE);

lewuyouc
离线
最后看到:2年1周前
加入:2016-07-18 01:38
你好

你好

蓝牙主动进入睡眠的时候,蓝牙断开连接,加了一个标志位,使得在进入睡眠模式前,断开连接,不调用广播函数。

问题:现阶段,蓝牙睡眠,唤醒,传感器等都能正常工作。和手机连接后,蓝牙也能主动断开进入睡眠模式,但是在测试通信距离时候,

手机和蓝牙大概10米多时候,手机和蓝牙设备断开,蓝牙设备死机,项目也添加乐看门狗,请问为何会死机?我应该如何去排查问题。

(远距离断开连接后死机概率大概2/3)

CYibin
离线
最后看到:10个月,3个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

请问你的问题是:断开蓝牙后,设备会有几率死机;还是:在不同情况下断开(主动断开或拉远距离断开),设备有几率死机?

我比较倾向于前者,因为对于设备固件来说,无论如何断开,固件都会回调on_disconnect函数,区别只是断开原因不同。

假设是前者,在这么大概率断开导致死机的情况下,原因很可能在出在你设备的休眠流程没做好,正常的流程应该是:

// 1. 设备上电,依次进行硬件初始化,协议栈初始化,内核初始化,蓝牙服务初始化的过程,上述完成之后,回调: void default_app_on_db_init_complete(void){EXECUTE_default_OPERATION_void(default_OPERATION_adv);//完成初始化工作,发出广播,若想上电不发出广播,则将1.点中的广播语句屏蔽掉即可 } // 2.假设是通过一个按键来使系统在“休眠”和“唤醒”之间切换的,并且休眠时,蓝牙不广播,唤醒时,蓝牙有广播。则有以下处理 静态布尔睡眠=真;静态bool need\u enter\u sleep=false;静态无效应用程序按钮按下cb(无效){if(GetBits16(SYS_STAT_REG,PER_IS_DOWN)){periph_init()}如果(!睡眠(英语)//当前不在休眠模式,需要进入休眠 { 需要输入睡眠=真;如果(用户\u已连接\u idx!=GAP_无效_CONIDX){app_easy_GAP_disconnect(user_connected_idx)}else{app_easy_gap_advertive_stop();}else//当前属于休眠模式,需要退出休眠 { 需要输入睡眠=假;睡眠=假;用户_app_adv_start();}无效用户应用程序连接(uint8应用程序连接idx,结构gapc应用程序连接req ind const*参数){if(应用程序环境[connection\U idx].conidx!=GAP_无效_CONIDX){user_connected_idx=connection_idx;}void user_app_disconnect(struct gapc_disconnect_ind const*param){uint8_t state=ke_state_get(TASK_app);if((state==APP_SECURITY)|(state==APP_CONNECTED)|(state==APP_PARAM_UPD)){if(need_enter_sleep){need_enter_sleep=false;sleep_en=true;}else{sleep_en=false;用户_app_adv_start();}否则{//我们没有处于连接状态ASSERT_ERR(0);}void user_app_adv_indirect_complete(const uint8_t status){if(status==GAP\u ERR\u cancelled){sleep\u en=true;需要输入\u sleep=false;}

lewuyouc
离线
最后看到:2年1周前
加入:2016-07-18 01:38
你好

你好

感谢回复,我会再检讨下。

主动断开没发现问题,死机都是在拉远距离会发生,通过日志看调用on_disconnect然后死机

Void user_on_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param) {arch_printf("user_on_connection\r\n");save_connection_idx = connection_idx;default_app_on_connection (connection_idx参数);} void user_on_disconnect(struct gapc_disconnect_ind const *param){if(disconnect_no_adv_flag==0){default_app_on_disconnect(param);} arch_printf(“user_on_disconnect \ r \ n”);} void set_device_to_sleep(void) {uint8_t delay_time = 0x80;arch_printf(“set_device_to_sleep \ r \ n”);if(alg_timer_hnd != EASY_TIMER_INVALID_TIMER){app_easy_timer_cancel(alg_timer_hnd);alg_timer_hnd = EASY_TIMER_INVALID_TIMER;} if(key_timer_hnd != EASY_TIMER_INVALID_TIMER){app_easy_timer_cancel(key_timer_hnd); key_timer_hnd = EASY_TIMER_INVALID_TIMER; } if(ke_state_get(TASK_APP)==APP_CONNECTED){ disconnect_no_adv_flag = 1; app_easy_gap_disconnect(save_connection_idx); arch_printf("111ke_state_get(TASK_APP)=%d\r\n",ke_state_get(TASK_APP)); } GPIO_SetInactive(GPIO_LED1_GREEN_PORT,GPIO_LED1_GREEN_PIN); GPIO_SetInactive(GPIO_LED2_RED_PORT,GPIO_LED2_RED_PIN); GPIO_SetInactive(GPIO_LED3_YELLOW_PORT,GPIO_LED3_YELLOW_PIN); while(delay_time--); app_easy_gap_advertise_stop(); arch_printf("222ke_state_get(TASK_APP)=%d\r\n",ke_state_get(TASK_APP)); hsppad042a_standby(); hsactd_set_to_sniff(); arch_ble_ext_wakeup_on(); i2c_release(); app_accInt_wakeup_enable(); arch_set_extended_sleep(); }

由于调用app_easy_gap_disconnect (save_connection_idx);会进入user_on_disconnect,然后开始广播,所以添加disconnect_no_adv_flag标志位控制不广播。

set_device_to_sleep函数中ke_state_get (TASK_APP)两次都是5。这应该是不正常的,需要添加ke_state_set (TASK_APP)函数吗?

CYibin
离线
最后看到:10个月,3个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

1.调用app_easy_gap_disconnect (save_connection_idx);后,无需再次调用app_easy_gap_advertise_stop ();

2.而(delay__time——)的延时时间时多少吗?由于系统是基于消息机制的,所以一般情况下,任何消息回调中都不能有明显的阻塞

3.拱门可外接唤醒开启();app_accInt_wakeup_enable();这两行代码除了在断开处理外,还应该放在:

void user_app_adv_undirect_complete(const uint8_t status) {if (status == GAP_ERR_CANCELED) {sleep_en = true;need_enter_sleep = false;arch_ble_ext_wakeup_on ();/ /设置一个标志位,使系统只能通过外部GPIO信号唤醒app_accInt_wakeup_enable ();// 使能唤醒源 } }

lewuyouc
离线
最后看到:2年1周前
加入:2016-07-18 01:38
你好,在用户\u应用\u adv\u非直接

你的好,在user_app_adv_undirect_complete添加arch_ble_ext_wakeup_on();和app_accInt_wakeup_enable();每次都会死机。

请问拱门可外接唤醒开启()//将BLE核心置于永久睡眠状态。只有外部事件才能唤醒它

是否调用arch_ble_ext_wakeup_on蓝牙内核立马进入睡眠模式?此时如果存在定时回调函数是否旧会出错?

CYibin
离线
最后看到:10个月,3个星期前
工作人员
加入:2017-12-14 02:48
你好,

你好,

正常情况下,系统进入休眠之后,还是会因为一些事件定时的被唤醒,比如,蓝牙事件,定时器事件等

调用了arch_ble_ext_wakeup_on函数后,系统就只在一种情况下会被唤醒:外部中断。其它的,比如蓝牙事件,定时器事件,都会失效。