设备平均每20秒断开一次连接

⚠️
你好。。谢谢你来参加论坛。令人兴奋的消息!我们现在正在移动到我们的新论坛平台,将提供更好的功能,并包含在主对话网站的过程。所有帖子和账号都已迁移。我们现在只接受新论坛上的流量-请在//www.xmece.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
12个职位/0个新职位
最后一篇文章
Ezza.
离线
最后一次见到:6个月前1年
已加入:2017-09-07 11:33
设备平均每20秒断开一次连接

你好,
我正在使用DA14580来通过UART传输数据。
当我添加UART连接时,设备将在AVG中每隔20秒与手机断开连接。
如果我不使用UART,设备不会断开连接。(来自主循环,我每10秒发送每10秒的UART请求)
用户应用程序断开连接在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,
结构gapc\u disconnect\u ind const*参数,
任务id常量目标id,
Keu任务\u id \u t const src \u id)
{
if(KE\u IDX\u GET(src\u id)==diss\u env.con\u info.conidx)
{
vist_disable(param-> conhdl);
}

返回(已消耗的消息);
}

------------------------------
gapc\u disconnect\u ind const*param参数有断开连接的原因。

///表示链接已断开
结构gapc\u disconnect\u ind
{
///连接手柄
uint16控制盘;
///断开原因
原因;
};
这个原因值为0x08。

MT\u对话框
离线
最后一次见到:3个月2天前
工作人员
已加入:2015-06-08 11:34
嗨,埃扎,

嗨,埃扎,

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

谢谢你的对话

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

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

伊布科林
离线
最后一次见到:4个月2天前
已加入:2016-03-18 10:34
嗨,埃扎,

嗨,埃扎,

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

问候,
奥利弗

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

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

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

谢谢,
Ezza.

伊布科林
离线
最后一次见到:4个月2天前
已加入:2016-03-18 10:34
嗨,埃扎,

嗨,埃扎,

要定期读取这些值,我强烈建议使用easy timer api,而不是更改arch\u main,因为这很容易干扰可编程的计时。我将如何实现这一点:

#定义读取值间隔1000//1=>10ms

static timer\u hnd readValueTimer=EASY\u timer\u INVALID\u timer;
静态uint8 rxData[RX_SIZE];

void rxUartCallback(uint8状态){
如果(状态==UART\U OK){
//处理rxdata
readValueTimer=app\u easy\u timer(100,readValueFromUart);
}其他{
//错误处理
}
}

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

uint8 cmd[]={…};
uart\u write(cmd,sizeof(cmd),NULL);
}

无效用户连接(uint8\u t connection\u idx,struct gapc\u connection\u req\u ind const*param){
...
ReadValuetimer = app_easy_timer(Read_Value_Interval,ReadValueFromuart);
}

void user\u on \u disconnect(struct gapc \u disconnect \u ind const*param){
如果(readValueTimer!=简易\u计时器\u无效\u计时器){
应用程序\简易\定时器\取消(readValueTimer);
readValueTimer=EASY\u TIMER\u INVALID\u TIMER;
}
}

问候,
奥利弗

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

你好,
不幸的是,它仍然是同一个问题。我改变了我的代码,从arch\u main中删除了所有内容,并使用easy\u timer。
而且,即使我从手机上发送“write”之类的事件,它仍然会在平均20秒后断开连接。

伊布科林
离线
最后一次见到:4个月2天前
已加入:2016-03-18 10:34
是连接稳定

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

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

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

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

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

MT\u对话框
离线
最后一次见到:3个月2天前
工作人员
已加入:2015-06-08 11:34
嗨,埃扎,

嗨,埃扎,

您必须防止任何UART活动与您的连接间隔重叠,UART通信应处于突发状态,并且不会让ARM占用很长时间,因为如果您这样做,ARM将无法按时编程BLE事件。例如,为了处理任何UART事件,您可以在系统上的.app\u中附加UART逻辑,但不应在那里停留太久,您应该返回KEEP \u POWERED,以便再次强制运行schedule \u while \u on(),以便计划将要发生的任何ble事件,然后SDK将在UART活动的其余部分再次运行.app \u on \u system \u POWERED。关于增加监控超时,我假设现在超时时间是20秒,如果增加它,这将使您免于断开连接,这取决于您使用的连接间隔,但是这不是一个解决方案,您应该检查您的实现,以便在UART交互期间不丢失连接事件。您无法停止触发断开连接,一旦发生监视超时,消息将从堆栈中提交,即使您阻止通知回调的消息,设备仍将断开连接。

谢谢你的对话