你好,我用DA14580通过UART传输数据。当我添加uart连接时,设备平均每20秒就与手机断开一次连接。如果我不使用uart,设备就不会断开连接(从主循环,我每10秒发送一次uart请求)user_app_disconnect.20SEC通过电话连接到设备后调用。
我的UART实现可能导致设备断开连接是什么?或者,如何防止设备断开连接。如何弄清楚导致断开连接的原因。
谢谢,埃扎
在调试之后,gapc\u disconnect\u ind\u处理程序被调用。
静态int gapc\u disconnect\u ind\u处理程序(ke\u msg\u id\u t const msgid,struct gapc_disconnect_ind const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id){if(ke_idx_get(src_id)== diss_env.con_info.conidx){diss\ U disable(参数->控制盘);}
return(ke_msg_consumed);}
-----------------------------------gapc_disconnect_ind const * param参数有一个断开连接的原因。
///表示链接已断开连接struct gapc_disconnect_ind.{///连接句柄uint16_t conhdl;///断开的原因UINT8_T理由;};这原因值为0x08。
嗨Ezza,
好吧,我可以假设的是,您使用UART保持ARM处于占用状态,并且在这段时间内没有安排可恢复的事件,因此设备永远不会按时起床处理连接事件,最终您将失去连接事件,并且发生超时。您得到的断开原因是由于连接超时,这表明您缺少连接事件。
谢谢mt_dialog.
你好,谢谢你的回复。我怎样才能防止这种情况发生?我不希望我的设备在uart事件期间断开连接。
也许您在主循环中的UART调用期间正在进行一些耗时或阻塞操作?你是什么意思“主循环”?据我所知,用户应用程序API中没有主循环,只是回调。我想我们必须看到你的代码更好地了解这一点。
当做,奥利弗
你好,因为DA14580没有“读取”指示事件。我必须进入主拱门并在那里添加自定义代码。在Arch_Main的主循环中,我调用UART命令来更新BLE的DB,以便手机应用读取更新的数据。例如,我在我的ST固件上有一个计数器,该计数器正在全部更新,并且应用程序需要读取该计数器。我通过每10秒发送来自主循环的UART命令,在BLE的DB上保持更新。
有没有办法增加disconction事件的超时值(i、 e.即使我没有捕捉到连接事件,也要等待超过20秒)。为什么通过UART发送\获取命令会导致断开连接?
要定期阅读值,我强烈建议使用易于计时器API而不是更改ARCH_MAIN,因为这可以很容易地打扰BLE定时。以下是我如何实现这一点:
#define read_value_interval 1000 // 1 => 10ms
静态timer_hnd readvaluetimer = easy_timer_invalid_timer;静态UINT8 rxdata [rx_size];
void rxuartcallback(uint8状态){if(state == uart_ok){//在此处处理rxDataReadValuetimer = app_easy_timer(100,ReadValueFromuart);} 别的 {//错误处理}}
void readValueFromUart(){uart\u read(rxData,RX\u SIZE,rxUartCallback);
uint8 cmd [] = {...};UART_WRITE(cmd,sizeof(cmd),null);}
void user_on_connection(uint8_t connection_idx,struct gapc_connection_req_ind const * param){......readValueTimer=app\u easy\u timer(读取值间隔,readValueFromUart);}
void user_on_disconnect(struct gapc_disconnect_ind const * param){if(readvaluetimer!= easy_timer_invalid_timer){app_easy_timer_cancel(ReadValuetimer);readvaluetimer = easy_timer_invalid_timer;}}
你好,不幸的是,它仍然是相同的问题。我更改了代码并从Arch_Main中删除了所有内容并使用Easy_Timer。此外,即使我从手机上发送活动,如“写入”,它仍然将在AVG中的20SEC中断开连接。
连接是否稳定,而不读取/写入特性,并且仅在后台通过uart连续读取值?
你好,即使我什么都不做(不读不写),它也不稳定。我只是连接到设备并等待它断开连接。
你好,我在哪里可以处理断开连接事件并防止其发生?它对我们来说是一个拦路虎,因为设备不断断开连接,手机应用程序获取异常,直到它最终成功读取所有来自ble的值。这导致性能急剧下降。
您将阻止任何UART活动重叠连接间隔,UART通信应突发,而不是长时间占用的ARM,因为您可以按时按时编程BLE事件。例如,您可以在.app_on_system_powered中附加一个UART逻辑才能处理任何UART事件,但您不应该长时间留在那里,您应该返回Keep_Power后,以便再次强制计划_While_ble_on()以重新运行以便安排任何将发生的BLE事件,然后SDK将在其余的UART活动中再次运行.app_on_system_powered。关于增加监督超时,我想现在超时大约20秒如果增加它,那么这将从断开连接取决于您正在使用的连接间隔,但再次这不是您应该查看您的实现的解决方案为了在UART交互期间不放松连接事件。您无法停止断开触发断开,只要监控超时发生,即使阻止您的回调仍将断开该消息,也会从堆栈中从堆栈中获取。
在调试之后,gapc\u disconnect\u ind\u处理程序被调用。
静态int gapc\u disconnect\u ind\u处理程序(ke\u msg\u id\u t const msgid,
struct gapc_disconnect_ind const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
if(ke_idx_get(src_id)== diss_env.con_info.conidx)
{
diss\ U disable(参数->控制盘);
}
return(ke_msg_consumed);
}
-----------------------------------
gapc_disconnect_ind const * param参数有一个断开连接的原因。
///表示链接已断开连接
struct gapc_disconnect_ind.
{
///连接句柄
uint16_t conhdl;
///断开的原因
UINT8_T理由;
};
这原因值为0x08。
嗨Ezza,
好吧,我可以假设的是,您使用UART保持ARM处于占用状态,并且在这段时间内没有安排可恢复的事件,因此设备永远不会按时起床处理连接事件,最终您将失去连接事件,并且发生超时。您得到的断开原因是由于连接超时,这表明您缺少连接事件。
谢谢mt_dialog.
你好,
谢谢你的回复。
我怎样才能防止这种情况发生?
我不希望我的设备在uart事件期间断开连接。
嗨Ezza,
也许您在主循环中的UART调用期间正在进行一些耗时或阻塞操作?你是什么意思“主循环”?据我所知,用户应用程序API中没有主循环,只是回调。我想我们必须看到你的代码更好地了解这一点。
当做,
奥利弗
你好,
因为DA14580没有“读取”指示事件。我必须进入主拱门并在那里添加自定义代码。
在Arch_Main的主循环中,我调用UART命令来更新BLE的DB,以便手机应用读取更新的数据。
例如,我在我的ST固件上有一个计数器,该计数器正在全部更新,并且应用程序需要读取该计数器。我通过每10秒发送来自主循环的UART命令,在BLE的DB上保持更新。
有没有办法增加disconction事件的超时值(i、 e.即使我没有捕捉到连接事件,也要等待超过20秒)。
为什么通过UART发送\获取命令会导致断开连接?
谢谢,
埃扎
嗨Ezza,
要定期阅读值,我强烈建议使用易于计时器API而不是更改ARCH_MAIN,因为这可以很容易地打扰BLE定时。以下是我如何实现这一点:
#define read_value_interval 1000 // 1 => 10ms
静态timer_hnd readvaluetimer = easy_timer_invalid_timer;
静态UINT8 rxdata [rx_size];
void rxuartcallback(uint8状态){
if(state == uart_ok){
//在此处处理rxData
ReadValuetimer = app_easy_timer(100,ReadValueFromuart);
} 别的 {
//错误处理
}
}
void readValueFromUart(){
uart\u read(rxData,RX\u SIZE,rxUartCallback);
uint8 cmd [] = {...};
UART_WRITE(cmd,sizeof(cmd),null);
}
void user_on_connection(uint8_t connection_idx,struct gapc_connection_req_ind const * param){
......
readValueTimer=app\u easy\u timer(读取值间隔,readValueFromUart);
}
void user_on_disconnect(struct gapc_disconnect_ind const * param){
if(readvaluetimer!= easy_timer_invalid_timer){
app_easy_timer_cancel(ReadValuetimer);
readvaluetimer = easy_timer_invalid_timer;
}
}
当做,
奥利弗
你好,
不幸的是,它仍然是相同的问题。我更改了代码并从Arch_Main中删除了所有内容并使用Easy_Timer。
此外,即使我从手机上发送活动,如“写入”,它仍然将在AVG中的20SEC中断开连接。
连接是否稳定,而不读取/写入特性,并且仅在后台通过uart连续读取值?
你好,
即使我什么都不做(不读不写),它也不稳定。
我只是连接到设备并等待它断开连接。
你好,
我在哪里可以处理断开连接事件并防止其发生?
它对我们来说是一个拦路虎,因为设备不断断开连接,手机应用程序获取异常,直到它最终成功读取所有来自ble的值。这导致性能急剧下降。
嗨Ezza,
您将阻止任何UART活动重叠连接间隔,UART通信应突发,而不是长时间占用的ARM,因为您可以按时按时编程BLE事件。例如,您可以在.app_on_system_powered中附加一个UART逻辑才能处理任何UART事件,但您不应该长时间留在那里,您应该返回Keep_Power后,以便再次强制计划_While_ble_on()以重新运行以便安排任何将发生的BLE事件,然后SDK将在其余的UART活动中再次运行.app_on_system_powered。关于增加监督超时,我想现在超时大约20秒如果增加它,那么这将从断开连接取决于您正在使用的连接间隔,但再次这不是您应该查看您的实现的解决方案为了在UART交互期间不放松连接事件。您无法停止断开触发断开,只要监控超时发生,即使阻止您的回调仍将断开该消息,也会从堆栈中从堆栈中获取。
谢谢mt_dialog.