您必须防止任何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交互期间不丢失连接事件。您无法停止触发断开连接,一旦发生监视超时,消息将从堆栈中提交,即使您阻止通知回调的消息,设备仍将断开连接。
调试后,调用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。
嗨,埃扎,
嗯,我可以假设的是你正在使用UART占据的手臂,并且在此期间没有安排的BLE事件,因此该设备从未按时上升到连接事件,最终您正在丢失连接事件和连接事件发生超时。您获得的断开原因是由于连接超时,表示您缺少连接事件。
谢谢你的对话
你好,
谢谢回复。
我如何防止发生这种情况?
在UART事件期间,我不希望我的设备断开连接。
嗨,埃扎,
在主循环中的uart调用期间,您可能正在执行一些耗时或阻塞操作?你说的“主回路”是什么意思?据我所知,用户应用程序api中没有主循环,只有回调。我想我们得看看你的代码才能更好地理解。
问候,
奥利弗
你好,
由于DA14580没有“读取”指示事件。我不得不进入主拱门并在那里添加自定义代码。
在archèu main的主循环中,我调用UART命令来更新ble的DB,以便电话应用程序读取更新的数据。
例如,我的ST固件上有一个计数器,它一直在更新,应用程序需要读取该计数器。我通过每10秒从主循环发送一次UART命令来更新BLE的DB。
是否有任何方法可以提高Diremenction事件的超时的价值?(即即使我不捕获连接事件,也可以等待超过20s)。
为什么通过UART发送\获取命令会导致断开连接?
谢谢,
Ezza.
嗨,埃扎,
要定期读取这些值,我强烈建议使用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;
}
}
问候,
奥利弗
你好,
不幸的是,它仍然是同一个问题。我改变了我的代码,从arch\u main中删除了所有内容,并使用easy\u timer。
而且,即使我从手机上发送“write”之类的事件,它仍然会在平均20秒后断开连接。
连接是否稳定而不读取/写入特征,只在背景中持续读取UART上的值?
你好,
即使我什么都不做(没有读,没有写),它也不稳定。
我刚连接到设备并等待它以断开连接。
你好,
我在哪里可以厌倦断开连接事件,并阻止它发生?
它为我们提供了阻塞,因为设备不断断开连接,并且手机应用程序获得了异常,直到它最终成功读取来自BLE的所有值。这导致对性能的显着降低。
嗨,埃扎,
您必须防止任何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交互期间不丢失连接事件。您无法停止触发断开连接,一旦发生监视超时,消息将从堆栈中提交,即使您阻止通知回调的消息,设备仍将断开连接。
谢谢你的对话