本篇博文最后修改时间:2017年06月02日,09:21。
一、简介
本文以SimpleBLECentral工程为例,介绍CC2640作为主机时是如何获取从机char4通道的notify数据。
二、实验平台
协议栈版本:ble_cc26xx_2_01_00_44423
编译软件:IAR Embedded Workbench for ARM Version 7.40
硬件平台:两台CC26xxDK开发板
仿真器:XDS100V3(香瓜)
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜单片机之STM8/STM32群:164311667
香瓜单片机之Linux群:512598061
香瓜单片机之职场交流群:450154342
香瓜单片机之职场交流群:450154342
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、
实验前提
1、在进行本文步骤前,请先
阅读
以下博文:
1)《CC2541之主机端获取notify数据》:http://blog.csdn.net/feilusia/article/details/50680035
2、在进行本文步骤前,请先
实现
以下博文:
暂无
五、实验步骤
1、添加宏定义(SimpleBLECentral.c中)
//GUA
#define GATT_CLIENT_CFG_NOTIFY 0x0001 //打开notify开关的数值
#define GATT_CLIENT_CFG_INDICATE 0x0002 //打开indicate开关的数值
#define GUA_CHAR4_Hdl 0x2E //char4的句柄
#define GUA_CHAR4_CCC_Hdl 0x2F //char4的CCC的句柄
//GUA
这里把char4的句柄写死了,实际上应该要通过获取的方式获得,香瓜此处偷懒。
2、修改UP按键部分代码(SimpleBLECentral.c的SimpleBLECentral_handleKeys函数中)
if (keys & KEY_UP)
{
// Start or stop discovery
if (state != BLE_STATE_CONNECTED)
{
if (!scanningStarted)
{
scanningStarted = TRUE;
scanRes = 0;
LCD_WRITE_STRING("Discovering...", LCD_PAGE2);
LCD_WRITE_STRING("", LCD_PAGE3);
LCD_WRITE_STRING("", LCD_PAGE4);
GAPCentralRole_StartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
}
else
{
GAPCentralRole_CancelDiscovery();
}
}
else if (state == BLE_STATE_CONNECTED &&
charHdl != 0 &&
procedureInProgress == FALSE)
{
attWriteReq_t writeReq;
writeReq.pValue = GATT_bm_alloc(connHandle, ATT_WRITE_REQ, 2, NULL);
if (writeReq.pValue != NULL)
{
writeReq.len = 2;
writeReq.pValue[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);
writeReq.pValue[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);
writeReq.sig = 0;
writeReq.cmd = 0;
writeReq.handle = GUA_CHAR4_CCC_Hdl;
// Send the read request
if (GATT_WriteCharValue(connHandle, &writeReq,selfEntity) != SUCCESS)
{
GATT_bm_free((gattMsg_t *)&writeReq, ATT_WRITE_REQ);
}
}
/*
uint8_t status;
// Do a read or write as long as no other read or write is in progress
if (doWrite)
{
// Do a write
attWriteReq_t req;
req.pValue = GATT_bm_alloc(connHandle, ATT_WRITE_REQ, 1, NULL);
if ( req.pValue != NULL )
{
req.handle = charHdl;
req.len = 1;
req.pValue[0] = charVal;
req.sig = 0;
req.cmd = 0;
status = GATT_WriteCharValue(connHandle, &req, selfEntity);
if ( status != SUCCESS )
{
GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
}
}
else
{
status = bleMemAllocError;
}
}
else
{
// Do a read
attReadReq_t req;
req.handle = charHdl;
status = GATT_ReadCharValue(connHandle, &req, selfEntity);
}
if (status == SUCCESS)
{
procedureInProgress = TRUE;
doWrite = !doWrite;
}
*/
}
return;
}
3、添加接收通知数据的处理部分代码(SimpleBLECentral.c的simpleBLECentralProcessGATTMsg函数末尾)
//香瓜
else if ( ( pMsg->method == ATT_HANDLE_VALUE_NOTI ) ) //通知
{
if( pMsg->msg.handleValueNoti.handle == GUA_CHAR4_Hdl) //CHAR6的通知 串口打印
{
char str[32] = {0};
memcpy(str, pMsg->msg.handleValueNoti.pValue, pMsg->msg.handleValueNoti.len );
}
}
//香瓜
注:香瓜在这里直接用2541的处理代码,没有验证过,如果有编译错误,跟香瓜联系。
六、实验结果
在连接状态时,按UP键会打开char4的notify开关。在5S内会接收到来自从机的1个字节数据(0x03)。
注:香瓜这里直接使用2541的实验结果。如果结果有误,请跟香瓜联系。