【BLE】CC2541之主機端讀取特征值
本篇博文最後改動時間: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、在進行本文步驟前,請先
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之主機端讀取特征值