关于ch579 蓝牙设置MTU对连接质量的问题

我像问一下,修改ch579config中的BLE_BUFF_MAX_LEN为250  BLE_BUFF_NUM为10  BLE_TX_NUM_EVENT为40 会对蓝牙发送有影响吗

我现在遇到的问题: 在第一次连接上蓝牙之后,发送命令等都正常,发送240字节的包也正常,但是断开连接再连接,发送命令后,

mcu就挂了。我不确定是不是因为改了这几个参数,因为之前的工程只是发json 串,没有发过大包,是正常的


static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,

                                 uint8 *pValue, uint16 len, uint16 offset,uint8 method  )

{

  bStatus_t status = SUCCESS;

//uint8 notifyApp = 0xFF;

  

  // If attribute permissions require authorization to write, return error

  if ( gattPermitAuthorWrite( pAttr->permissions ) )

  {

    // Insufficient authorization

    return ( ATT_ERR_INSUFFICIENT_AUTHOR );

  }

  

  if ( pAttr->type.len == ATT_BT_UUID_SIZE )

  {

    // 16-bit UUID

    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);

    switch ( uuid )

    {

      case SIMPLEPROFILE_CHAR1_UUID:

        //Validate the value

        // Make sure it's not a blob oper

        if ( offset == 0 )

        {

          if ( len > SIMPLEPROFILE_CHAR1_LEN )

          {

            status = ATT_ERR_INVALID_VALUE_SIZE;

          }

        }

        else

        {

          status = ATT_ERR_ATTR_NOT_LONG;

        }

        

        //Write the value

        if ( status == SUCCESS )

        {

          tmos_memcpy( pAttr->pValue, pValue, SIMPLEPROFILE_CHAR1_LEN );

          //notifyApp = SIMPLEPROFILE_CHAR1;        

        }            

        break;

        

case SIMPLEPROFILE_CHAR2_UUID:

        //Validate the value

        // Make sure it's not a blob oper

        if ( offset == 0 )

        {

          if ( len > SIMPLEPROFILE_CHAR2_LEN )

          {

            status = ATT_ERR_INVALID_VALUE_SIZE;

          }

        }

        else

        {

          status = ATT_ERR_ATTR_NOT_LONG;

        }

        

        //Write the value

        if ( status == SUCCESS )

        {

          tmos_memcpy( pAttr->pValue, pValue, SIMPLEPROFILE_CHAR2_LEN );

tmos_memcpy( pAppValue, pValue, SIMPLEPROFILE_CHAR2_LEN );

          deal_json(pAppValue);

          //notifyApp = SIMPLEPROFILE_CHAR2;        

        }            

        break;

        

    

      case GATT_CLIENT_CHAR_CFG_UUID:

        status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len,

                                                 offset, GATT_CLIENT_CFG_NOTIFY );

        break;

        

      default:

        // Should never get here! (characteristics 2 and 4 do not have write permissions)

        status = ATT_ERR_ATTR_NOT_FOUND;

        break;

    }

  }



if (app_cmd == CMD2_START_MEASURE1){

if(Page_OPT.Page_ID ==  PAGE_ID_WaitForPipe){

// 清除流量

sensor_clear_flow(&GAS);

sensor_set_samlpe_interval(&GAS, 1);

sensor_data.time = 0;

//清除存储值

time_display = 0;

TMR0_init();

tmos_start_task(SYSTEM_TaskID, RUN_EVENT_MSG, MS1_TO_SYSTEM_TIME(100));

tmos_start_task(SYSTEM_TaskID,V_Q_CHANGE_MSG,MS1_TO_SYSTEM_TIME(100));

tmos_start_task(SYSTEM_TaskID,BLE_SEND_FIRST_MEASURE_DATA,MS1_TO_SYSTEM_TIME(50));

time_inver = time_count;

}

LCD_KEY_PAGE_START();



我像问一下config中BLE_BUFF_MAX_LEN 改为250??BLE_BUFF_NUM改为10?BLE_TX_NUM_EVENT改为40 对蓝牙连接的稳定性有没有关系,我改完之后,会偶尔出现发包卡死的问题


我遇到的问题:

改完包后,第一次连接发送读取数据的指令,可以读到数据,并且循环发送也都能收到数据,但是断开连接后,再发送读取数据的指令,整个就会卡死,这个断开连接再连接的过程可能两到三次,就会出现卡死的问题

在之前的工程中,我只是发送一些json串,没有改过这些参数,是没有出现问题的



您好,BLE从机默认代码中char1~char4默认通信数据长度都是1,char5是5。

如要修改MTU,BLE从机例程中注意修改如下几处

1.config.h中BLE_BUFF_MAX_LEN改为最大值251

2.gattprofile.h中SIMPLEPROFILE_CHARn_LEN(n=1~5)改为最大值243(char4默认使用notify,协议开销少一个字节,故char4的MTU可以配置244)

3. 如果需要使用notify且发包负载大于20个字节,则CH58xBLE_LIB.h中的ATT_MTU_SIZE也需要扩大为最大负载+3


BLE主机如果是手机APP,要看APP的是否对MTU有调整。如果手机APP是BLE调试助手,每次连接后要在APP右上角修改MTU为251(最大值视情况而定,与config.h中的BLE_BUFF_MAX_LEN一致就好)


只有登录才能回复,可以选择微信账号登录