【BLE】CC2541之主机端读取特征值
来源:互联网 发布:淘宝预售不能合并付款 编辑:程序博客网 时间:2024/05/22 15:03
本篇博文最后修改时间: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 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)将SimpleBLEPeripheral工程的代码下进其中一块Smart RF中,使其上电广播。
2)在SimpleBLECentral工程中仿真,在如下图位置设置断点,并根据方向键进行扫描、选择设备、连接,在连接上1S之后,会自然停在断点,看到如下图的char1的数据:
2 0
- 【BLE】CC2541之主机端读取特征值
- 【BLE】CC2541之添加特征值
- 【BLE】CC2541之添加特征值
- 【BLE】CC2541之发现服务与特征值
- 【BLE】CC2541之主机端获取广播包数据
- 【BLE】CC2541之主机端获取notify数据
- 【BLE】CC2541之发现多个特征值句柄
- CC2541之添加特征值
- <蓝牙BLE>cc2541发现服务与特征值
- 【BLE】CC2541之notify
- 【BLE】CC2541之按键
- 【BLE】CC2541之RSSI
- 【BLE】CC2541之OLED
- 【BLE】CC2541之indicate
- 【BLE】CC2541之timer3
- 【BLE】CC2541之看门狗
- 【BLE】CC2541之SNV
- 【BLE】CC2541之OAD
- bzoj 1008 [HNOI2008]越狱
- 浮点数的等值判断
- WCF学习问题分享1
- HUD 1142详解带翻译 (以前看了好多大神的算法看不懂,学了之后终于看懂了,献给和我一样刚入门的菜鸟)
- NYOJ 三个水杯
- 【BLE】CC2541之主机端读取特征值
- 208. Implement Trie (Prefix Tree)
- 2016/4/13
- uva 11129 An antiarithmetic permutation
- ffmpeg一键编译
- 计算重复字符个数
- 如何在浏览器中debug-谷歌浏览器(Google Chrome )
- 小译UnityAPI-Update,FixedUpdate ,LateUpdate
- sizeof()测试程序