AT指令修改蓝牙(从机)多连接个数

首先实现蓝牙(从机)多连接功能,找到支持4.2ble的SDK以及协议找。这个以sdk15.0.0和协议栈6.0.0为例。

1、接收修改从机连接个数的AT指令,用fds来储存(掉电不丢失):

if ( memcmp(pBuffer, "AT+SLAVE=", 10)==0)
{
        memset(strTemp, 0 , sizeof(strTemp));
            
        err_code = fds_read_record(change_mode,FILE_ID,REC_KEY2);
        APP_ERROR_CHECK(err_code);
            
         if(change_mode[0] == pBuffer[10])
         {
              sprintf(strTemp, "OKsetSLAVE%s",change_mode);
              send_string((uint8_t *)strTemp, 12);
         }
         else
         {
             if((pBuffer[10] <= 0x36) && (pBuffer[10] >= 0x31))
             {
        //       strncpy((char *)strTemp, (char *)pBuffer + 10, 1);
                  if(pBuffer[10] == 0x36)
                  {
                       strTemp[0] = 0x36;
                  }
                  else if((pBuffer[10] < 0x36) && (pBuffer[10] >= 0x31))
                  {
                      strncpy((char *)strTemp, (char *)pBuffer + 10, 1);
                  }
                    
                  if(fds_find_record(FILE_ID,REC_KEY2) == NRF_SUCCESS)
                  {
                      err_code = fds_find_and_delete(FILE_ID,REC_KEY2);
                      APP_ERROR_CHECK(err_code);
                  }
                
                  err_code = fds_write_record(strTemp, 1, FILE_ID,REC_KEY2);
                  APP_ERROR_CHECK(err_code);
                  while (write_flag == 0);
                    
                  memset(change_mode, 0 , sizeof(change_mode));
                  memset(strTemp, 0, sizeof(strTemp));
                    
                  err_code = fds_read_record(change_mode,FILE_ID,REC_KEY2);
                  APP_ERROR_CHECK(err_code);
            //    while(uart_send_fifo_flag == 0);
                  if((change_mode[0] <= 0x36) && (change_mode[0] >= 0x31))
                  {
                      sprintf(strTemp, "OKsetCHANGE%s",change_mode);
            //        printf("%s", strTemp);
                      send_string((uint8_t *)strTemp, (strlen(strTemp)));
                  }else
                  {
                      send_string((uint8_t *)"ERRsetCHANGE", 12);
                  }                                        
                  restart = true;
                }
            }

}

2、读取fds中储存的要修改的连接的个数,保存到全局变量PERIPHERAL_LINK_COUNT 中:

   err_code = fds_read_record(&check_change_mode,FILE_ID,REC_KEY2);
   APP_ERROR_CHECK(err_code);
    
   if((check_change_mode<0x37) && (check_change_mode>0x30))
    {
        switch(check_change_mode)
        {
            case '1':
            {
                PERIPHERAL_LINK_COUNT = 1;
            }
            break;
            
            case '2':
            {            
                PERIPHERAL_LINK_COUNT = 2;
            }
            break;
            
            case '3':
            {
                PERIPHERAL_LINK_COUNT = 3;    
            }
            break;
            
            case '4':
            {
                PERIPHERAL_LINK_COUNT = 4;
            }        
            break;
            
            case '5':    
            {
                PERIPHERAL_LINK_COUNT = 5;
            }
            break;
            
            case '6':
            {
                PERIPHERAL_LINK_COUNT = 6;
            }
            break;
            
            default:
                break;            
        }
    }
    else
    {
        PERIPHERAL_LINK_COUNT = 6;
    }

3、把上面的全局变量PERIPHERAL_LINK_COUNT代替所有多连接相关的宏,比如:NRF_BLE_GATT_LINK_COUNT 、NRF_SDH_BLE_PERIPHERAL_LINK_COUNT 、NRF_BLE_CONN_PARAMS_INSTANCE_COUNT

测试过程的问题:

现象:动态修改多连接的个数和动态修改广播有冲突,导致死机,两者只能使用一个。

原因:读取fds中的数据时,导致内存越界。

你可能感兴趣的:(NRF52832)