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