154****com
您好,我在使用GR5515I0ND 基于SDK1.7.0开发BLE的过程中,遇到以下问题,当5515作为从机向主机ESP32发送大量数据时,发送的中途总是会出现以下错误(0x10)SDK_ERR_NO_RESOURCES,我的蓝牙发送函数如下:
sdk_err_t ebs_tx_data_send(uint8_t conn_idx, uint8_t *p_data, uint16_t length)
{
sdk_err_t error_code = SDK_ERR_NTF_DISABLED;
gatts_noti_ind_t send_cmd;
if (PRF_CLI_START_NTF == s_ebs_env.tx_ntf_cfg[conn_idx])
{
// Fill in the parameter structure
send_cmd.type = BLE_GATT_NOTIFICATION;
send_cmd.handle = prf_find_handle_by_idx(EBS_IDX_TX_VAL, s_ebs_env.start_hdl, (uint8_t *)&s_char_mask);
// Pack measured value in database
send_cmd.length = length;
send_cmd.value = p_data;
// Send notification to peer device
error_code = ble_gatts_noti_ind(conn_idx, &send_cmd);
}
return error_code;
}
sdk_err_t app_ble_data_send(uint8_t *p_data, uint16_t length)
{
sdk_err_t ret_code = BLE_SUCCESS;
uint16_t loop_cnt = 0;
uint16_t remainder = 0;
uint8_t i = 0;
uint16_t timeout = 0x1000;
if(!connect_flag)
return BLE_L2C_ERR_CONNECTION_LOST;
loop_cnt = length / send_once_size;
remainder = length % send_once_size;
for(i = 0; i < loop_cnt; i++)
{
g_ble_tx_done = 0;
ret_code = ebs_tx_data_send(connect_index, p_data + i * send_once_size, send_once_size);
while(g_ble_tx_done == 0)
{
if(timeout)
{
timeout--;
}
else
{
break;
}
}
if(ret_code)
{
return ret_code;
}
}
if(remainder)
{
g_ble_tx_done = 0;
ret_code = ebs_tx_data_send(connect_index, p_data + i * send_once_size, remainder);
while(g_ble_tx_done == 0)
{
if(timeout)
{
timeout--;
}
else
{
break;
}
}
}
return ret_code;
}
请帮忙指导,谢谢
yao****com
hi~
您好:
您这个问题的原因是调用 ebs_tx_data_send 接口发送数据太频繁,协议栈缓存buffer不够。
在频繁调用这个数据发送接口时,需要做一下数据发送结果的判断,确保数据已经发送成功再调用接口。
由于在不同的服务中调用该接口,数据发送成功返回的事件名称不一样,请参考以下示例。
示例:
在GR551x_SDK_V1.7.0\projects\ble\dfu\ble_dfu_fast\Keil_5示例工程中,
调用了接口 sdk_err_t fast_otas_notify_cmd_data(uint8_t conn_idx,uint8_t* p_data,uint16_t len) 发送数据,数据发送完成会对应返回一个“ FAST_OTAS_EVT_CMD_NOTIFY_COMPLETE ”事件。如果频繁使用这个接口,则需要判断一下返回了该事件,再调用接口进行数据发送。
希望对你有帮助,如有其它问题,欢迎多多交流哟~
打开微信,使用“扫一扫”即可关注