【BLE】CC2541之主机端读取特征值

本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

本文介绍如何在SimpleBLECentral工程中,读取SimpleBLEPeripheral工程中的特征值char1的数据。

(注:SimpleBLECentral工程默认即可通过UP键进行读、写特征值,而本文采用的方法是连接上从机后自动读取特征值数据


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:两块Smart RF(主芯片CC2541)


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

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

联系方式:897503845@qq.com

香瓜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 readattReadReq_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 handlesif ( 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 completeif ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  && pMsg->hdr.status == bleProcedureComplete ) ||( pMsg->method == ATT_ERROR_RSP ) ){if ( simpleBLESvcStartHdl != 0 ){// Discover characteristicsimpleBLEDiscState = 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 handleif ( 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)将SimpleBLEPeripheral工程的代码下进其中一块Smart RF中,使其上电广播。

2)在SimpleBLECentral工程中仿真,在如下图位置设置断点,并根据方向键进行扫描、选择设备、连接,在连接上1S之后,会自然停在断点,看到如下图的char1的数据:








本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部