设备平均每20秒断开一次

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.wsdof.com/support.我们将在未来几天修复bug /优化搜索和标记。
12个职位/ 0个新职位
最后发表
Ezza.
离线
最后看到:6个月前1年
加入:2017-09-07 11:33
设备平均每20秒断开一次

你好,
我正在使用DA14580来通过UART传输数据。
当我添加UART连接时,设备将在AVG中每隔20秒与手机断开连接。
如果我不使用UART,设备不会断开连接。(来自主循环,我每10秒发送每10秒的UART请求)
user_app_disconnect在通过电话连接到该设备20秒后调用。

我的uart实现可能会导致设备断开连接的问题是什么?或者,我如何防止设备断开连接。
我如何才能找出是什么导致断开。

谢谢,
Ezza.

设备:
Ezza.
离线
最后看到:6个月前1年
加入:2017-09-07 11:33
调试后,gapc

调试后,调用Gapc_disconnect_ind_handler。

静态int gapc_disconnect_ind_handler(ke_msg_id_t const msgid,
Struct gapc_disconnect_ind const *参数,
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)

vist_disable(param-> conhdl);

返回(KE_MSG_CONSUMED);

------------------------------
Gapc_disconnect_ind const *param parameter有一个断开的原因。

///表示链路已经断开
struct gapc_disconnect_ind

/ / /连接句柄
uint16_t conhdl;
///断开的原因
uint8_t原因;
};
原因值为0(。

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

嗨Ezza,

嗯,我可以假设的是你正在使用UART占据的手臂,并且在此期间没有安排的BLE事件,因此该设备从未按时上升到连接事件,最终您正在丢失连接事件和连接事件发生超时。您获得的断开原因是由于连接超时,表示您缺少连接事件。

由于MT_dialog

Ezza.
离线
最后看到:6个月前1年
加入:2017-09-07 11:33
你好,

你好,
谢谢回复。
我如何防止发生这种情况?
在UART事件期间,我不希望我的设备断开连接。

ibbkoeln
离线
最后看到:3个月3周前
加入:2016-03-18 34
嗨Ezza,

嗨Ezza,

也许您正在执行一些耗时或阻塞操作期间的uart调用在主循环?你说的“主回路”是什么意思?据我所知,用户应用程序api中没有主循环,只有回调。我想我们得看看你的代码才能更好地理解。

问候,
奥利弗

Ezza.
离线
最后看到:6个月前1年
加入:2017-09-07 11:33
你好,

你好,
由于DA14580没有“读取”指示事件。我不得不进入主拱门并在那里添加自定义代码。
在arch_main的主循环中,我调用UART命令来更新ble的DB,以便电话应用程序读取更新的数据。
例如,我的ST固件上有一个计数器,它一直在更新,应用程序需要读取该计数器。我通过每10秒从主循环发送UART命令来更新BLE的DB。

是否有任何方法可以提高Diremenction事件的超时的价值?(即即使我不捕获连接事件,也可以等待超过20s)。
为什么通过UART发送\getting命令会导致连接断开?

谢谢,
Ezza.

ibbkoeln
离线
最后看到:3个月3周前
加入:2016-03-18 34
嗨Ezza,

嗨Ezza,

为了定期读取这些值,我强烈建议使用简易计时器api,而不是更改arch_main,因为这会很容易干扰ble计时。以下是我将如何实现:

#define READ_VALUE_INTERVAL 1000 // 1 => 10ms

static timer_hnd readValueTimer = EASY_TIMER_INVALID_TIMER;
静态uint8 rxData [RX_SIZE];

rxUartCallback(uint8 state) {
如果(状态= = UART_OK) {
//处理rxdata
readValueTimer = app_easy_timer(100, readValueFromUart);
其他}{
//错误处理

void ReadValueFromuArt(){
UART_READ(rxdata,rx_size,rxuartcallback);

Uint8 cmd[] ={…};
uart_write (cmd, sizeof (cmd),空);

Void user_on_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param) {
...
ReadValuetimer = app_easy_timer(Read_Value_Interval,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;

问候,
奥利弗

Ezza.
离线
最后看到:6个月前1年
加入:2017-09-07 11:33
你好,

你好,
不幸的是,这仍然是同一个问题。我修改了我的代码并删除了arch_main中的所有内容,并使用了easy_timer。
此外,即使我从手机发送事件,如“写”,它仍然会在平均20秒断开。

ibbkoeln
离线
最后看到:3个月3周前
加入:2016-03-18 34
是连接稳定

连接是否稳定而不读取/写入特征,只在背景中持续读取UART上的值?

Ezza.
离线
最后看到:6个月前1年
加入:2017-09-07 11:33
你好,

你好,
即使我什么都不做(没有读,没有写),它也不稳定。
我刚连接到设备并等待它以断开连接。

Ezza.
离线
最后看到:6个月前1年
加入:2017-09-07 11:33
你好,

你好,
我在哪里可以厌倦断开连接事件,并阻止它发生?
它为我们提供了阻塞,因为设备不断断开连接,并且手机应用程序获得了异常,直到它最终成功读取来自BLE的所有值。这导致对性能的显着降低。

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

嗨Ezza,

您将防止任何UART活动重叠您的连接间隔,UART通信应该是突发的,并且不会占用ARM很长时间,因为如果您这样做,ARM将不能按时编程BLE事件。例如,你可以在.app_on_system_powered中附加一个UART逻辑,以处理任何UART事件,但你不应该在那里停留太久,你应该返回KEEP_POWERED以便再次强制schedule_while_ble_on()重新运行,以便调度将要发生的任何BLE事件,然后SDK将再次运行.app_on_system_powered用于UART活动的其余部分。关于增加监督超时,我认为现在超时已经很大了20秒,如果增加它,这将使你免于断开连接,这取决于你使用的连接间隔,但这不是一个解决方案,您应该检查您的实现,以避免在UART交互期间丢失连接事件。你不能阻止断开连接触发,消息会在监督超时发生时从堆栈发出,即使你阻止了通知你的回调设备将仍然断开连接的消息。

由于MT_dialog