请教一个问题
原来使用的是V3.5,ESP32 作为蓝牙服务端 ,手机APP作为蓝牙客户端,一直没有问题。
最近更新到了V4.4上,功能一样,手机APP向ESP32请求数据,如果数据量大的话就会收不全。每次按照最多20字节发送。
1、请求512 字节,大概是27个包,APP能够接收到完整的数据。
2、请求1024个自己的数据,大概是50多个包,APP端大概收到30多个包就收不到后续的字节包了,这样APP端就永远都不能够接受完整的数据。
请问应该如何调试,有什么解决办法?
ESP32 蓝牙发送的数据,手机接收不全!急急急!!!!!
-
- Posts: 9
- Joined: Fri Sep 20, 2019 7:41 am
Re: ESP32 蓝牙发送的数据,手机接收不全!急急急!!!!!
代码如下:
static void esp_ble_send_once(uint8_t * buf,int length)
{
if(buf!=NULL&&length>0){
esp_ble_gatts_send_indicate(g_iclouz_gatts_if, g_iclouz_conn_id, heart_rate_handle_table[IDX_CHAR_VAL_COMMAND],length, buf, false);
//esp_ble_gatts_send_indicate(g_iclouz_gatts_if, g_iclouz_conn_id, heart_rate_handle_table[IDX_CHAR_C],length, buf, false);
}
}
iclouz_err_t iclouz_esp_ble_send(uint8_t * buf,int length)
{
int index=0;
if(buf==NULL){
return ICLOUZ_FAIL;
}
do{
int len=(index+20)<=length?20:length-index;
//ESP_LOGI(GATTS_TABLE_TAG, "iclouz_esp_ble_send len =%d", len );
esp_ble_send_once(buf+index, len);
index+=len;
}while(index<length);
return ICLOUZ_OK;
}
static void esp_ble_send_once(uint8_t * buf,int length)
{
if(buf!=NULL&&length>0){
esp_ble_gatts_send_indicate(g_iclouz_gatts_if, g_iclouz_conn_id, heart_rate_handle_table[IDX_CHAR_VAL_COMMAND],length, buf, false);
//esp_ble_gatts_send_indicate(g_iclouz_gatts_if, g_iclouz_conn_id, heart_rate_handle_table[IDX_CHAR_C],length, buf, false);
}
}
iclouz_err_t iclouz_esp_ble_send(uint8_t * buf,int length)
{
int index=0;
if(buf==NULL){
return ICLOUZ_FAIL;
}
do{
int len=(index+20)<=length?20:length-index;
//ESP_LOGI(GATTS_TABLE_TAG, "iclouz_esp_ble_send len =%d", len );
esp_ble_send_once(buf+index, len);
index+=len;
}while(index<length);
return ICLOUZ_OK;
}
Re: ESP32 蓝牙发送的数据,手机接收不全!急急急!!!!!
我按你的场景进行复现了下,发现是上层向下传数据太快,造成底部拥塞了,这应该会有个状态上报在 ESP_GATTS_CONF_EVT 事件中,同时 esp_ble_gatts_send_indicate 返回值也会报错;
所以可以在两个 esp_ble_gatts_send_indicate 之间适当加点延时 vTaskDelay(5) 这样的, 应该可以解决这个问题
所以可以在两个 esp_ble_gatts_send_indicate 之间适当加点延时 vTaskDelay(5) 这样的, 应该可以解决这个问题
Who is online
Users browsing this forum: Google [Bot] and 191 guests