1. 程式人生 > >【BLE】CC2541之主機端讀取特征值

【BLE】CC2541之主機端讀取特征值

roi repl void 定時 store val star content else if

本篇博文最後改動時間:2017年01月06日,11:06。


一、簡單介紹

本文介紹怎樣在SimpleBLECentralproject中,讀取SimpleBLEPeripheralproject中的特征值char1的數據。

(註:SimpleBLECentralproject默認就可以通過UP鍵進行讀、寫特征值,而本文採用的方法是連接上從機後自己主動讀取特征值數據


二、實驗平臺

協議棧版本號:BLE-CC254x-1.4.0

編譯軟件:IAR 8.20.2

硬件平臺:兩塊Smart RF(主芯片CC2541)


版權聲明

博主:甜甜的大香瓜

聲明:喝水不忘挖井人。轉載請註明出處。

原文地址:http://blog.csdn.NET/feilusia

聯系方式:[email protected]

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜單片機之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、實驗前提 1、在進行本文步驟前,請先
閱讀下面博文: 1)《CC2541之發現服務與特征值》:http://blog.csdn.net/feilusia/article/details/46909847 2)《CC2541之發現多個特征值句柄》:http://blog.csdn.net/feilusia/article/details/48314165
2、在進行本文步驟前。請先實現下面博文:
暫無


五、基礎知識

暫無


六、實驗步驟

1、加入讀特征值事件

1)定義讀特征值事件SimpleBLECentral.c的SimpleBLECentral_ProcessEvent中

//香瓜
  if ( events & GUA_READ_CHAR1_EVT )
  { 
      // Do a read
      attReadReq_t req;
      uint8 status;
        
      req.handle = simpleBLECharHdl;
      status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );

      if ( status == SUCCESS )
      {
        simpleBLEProcedureInProgress = TRUE;
      }      
    
    return ( events ^ GUA_READ_CHAR1_EVT );
  }
//香瓜 

2)定義讀特征值事件的宏SimpleBLECentral.h中)

//香瓜  
#define GUA_READ_CHAR1_EVT                            0x0004
//香瓜  

2、在發現特征值句柄後直接讀取特征值(SimpleBLECentral.c的simpleBLEGATTDiscoveryEvent

static void simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )
{
  attReadByTypeReq_t req;
  
  if ( simpleBLEDiscState == BLE_DISC_STATE_SVC )
  {
    // Service found, store handles
    if ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
         pMsg->msg.findByTypeValueRsp.numInfo > 0 )
    {
      simpleBLESvcStartHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].handle;
      simpleBLESvcEndHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].grpEndHandle;
    }
    
    // If procedure complete
    if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  && 
           pMsg->hdr.status == bleProcedureComplete ) ||
         ( pMsg->method == ATT_ERROR_RSP ) )
    {
      if ( simpleBLESvcStartHdl != 0 )
      {
        // Discover characteristic
        simpleBLEDiscState = BLE_DISC_STATE_CHAR;
        
        req.startHandle = simpleBLESvcStartHdl;
        req.endHandle = simpleBLESvcEndHdl;
        req.type.len = ATT_BT_UUID_SIZE;
        req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
        req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

        GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );
      }
    }
  }
  else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR )
  {
    // Characteristic found, store handle
    if ( pMsg->method == ATT_READ_BY_TYPE_RSP && 
         pMsg->msg.readByTypeRsp.numPairs > 0 )
    {
      simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],
                                       pMsg->msg.readByTypeRsp.dataList[1] );
      
      LCD_WRITE_STRING( "Simple Svc Found", HAL_LCD_LINE_1 );
      simpleBLEProcedureInProgress = FALSE;
    }
    
    simpleBLEDiscState = BLE_DISC_STATE_IDLE;

//香瓜    
    osal_start_timerEx( simpleBLETaskId, GUA_READ_CHAR1_EVT, 1000 );//一定要延時一定時間,否則會讀取特征值失敗  
//香瓜     
  }    
}
特別註意,假設上面的定時器定時的是1ms,會失敗。

因此須要多延時一點時間。此處香瓜使用的是延時1S。


七、註意事項

暫無


八、實驗結果

1)將SimpleBLEPeripheralproject的代碼下進當中一塊Smart RF中,使其上電廣播。

2)在SimpleBLECentralproject中仿真。在例如以下圖位置設置斷點。並依據方向鍵進行掃描、選擇設備、連接。在連接上1S之後。會自然停在斷點。看到例如以下圖的char1的數據:

技術分享圖片






【BLE】CC2541之主機端讀取特征值