本篇博文最后改动时间: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
五、基础知识
暂无
六、实验步骤
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的数据: