我参考甜甜的大香瓜的博客文章给沁恒579增加特征值6,只成功了一半。
其中我感觉有两个地方可能有问题:
博客中第9步:
9、增加 char6 的发送通知数据的函数 1)定义 char6 的发送通知数据的函数(simpleGATTprofile.c 中) //******************************************************************************
//name: GUA_SimpleGATTprofile_Char6_Notify
//introduce: 发送 char6 通道的数据
//parameter: nGUA_ConnHandle: 连接句柄
// npGUA_Value: 要通知的数据,范围为 0~SIMPLEPROFILE_CHAR6,最多 20 个字节
// nGUA_Len: 要通知的数据的长度
//return: none
//author: 甜甜的大香瓜
//email: 个人信息保护,已隐藏
//QQ group 香瓜 BLE 之 CC2541(127442605)
//changetime: 2016.12.29
//******************************************************************************
void GUA_SimpleGATTprofile_Char6_Notify(uint16 nGUA_ConnHandle, uint8 *pGUA_Value, uint8 nGUA_Len)
{
attHandleValueNoti_t stGUA_Noti;
uint16 nGUA_Return; //读出 CCC 的值
nGUA_Return = GATTServApp_ReadCharCfg(nGUA_ConnHandle, simpleProfileChar6Config); //判断是否打开通知开关,打开了则发送数据
if (nGUA_Return & GATT_CLIENT_CFG_NOTIFY)
{
//填充数据
stGUA_Noti.handle = simpleProfileAttrTbl[GUA_ATTRTBL_CHAR6_VALUE_IDX].handle;
stGUA_Noti.len = nGUA_Len;
osal_memcpy(stGUA_Noti.value, pGUA_Value, nGUA_Len); //发送数据
GATT_Notification(nGUA_ConnHandle, &stGUA_Noti, FALSE);
}
}
注意,本函数仅适用于协议栈 1.3.2 和 1.4.0 版本。
1.4.2 版本的 attHandleValueNoti_t 结构体发生变化,需要多一条分配发送数据缓冲区的 代码。可以参考《CC2640 之自定义服务》的 notify 代码(不一定完全一样):
//分配发送数据缓冲区 stGUA_Noti.pValue = GATT_bm_alloc(nGUA_ConnHandle, ATT_HANDLE_VALUE_NOTI, GUAPROFILE_CHAR6_LEN, NULL);
我改的沁恒代码如下:
void GUA_SimpleGATTprofile_Char6_Notify(uint16 nGUA_ConnHandle, uint8 *pGUA_Value, uint8 nGUA_Len)
{
attHandleValueNoti_t stGUA_Noti;
uint16 nGUA_Return;
//读出 CCC 的值
nGUA_Return = GATTServApp_ReadCharCfg(nGUA_ConnHandle, simpleProfileChar6Config);
//判断是否打开通知开关,打开了则发送数据
if (nGUA_Return & GATT_CLIENT_CFG_NOTIFY)
{
//填充数据
stGUA_Noti.handle = simpleProfileAttrTbl[GUA_ATTRTBL_CHAR6_VALUE_IDX].handle;
stGUA_Noti.len = nGUA_Len;
//分配发送数据缓冲区
stGUA_Noti.pValue = GATT_bm_alloc(nGUA_ConnHandle, ATT_HANDLE_VALUE_NOTI, SIMPLEPROFILE_CHAR6_LEN, NULL,0);
tmos_memcpy(stGUA_Noti.pValue, pGUA_Value, nGUA_Len);
//发送数据
if( simpleProfile_Notify( nGUA_ConnHandle, &stGUA_Noti ) != SUCCESS )
{
GATT_bm_free( (gattMsg_t *)&stGUA_Noti, ATT_HANDLE_VALUE_NOTI );
}
}
}
另一个地方:
香瓜博客为:
2)修改应用层的回调函数(simpleBLEPeripheral.c 的 simpleProfileChangeCB 函数中)
static void simpleProfileChangeCB( uint8 paramID )
{
uint16 nGUA_ConnHandle;
uint8 nbGUA_Char6[20] = {0};
switch( paramID ) { //char1 case SIMPLEPROFILE_CHAR1:
以下从略。。。。。
//char6
case SIMPLEPROFILE_CHAR6:
{
//获取连接句柄
GAPRole_GetParameter(GAPROLE_CONNHANDLE, &nGUA_ConnHandle);
//读取 char6 的数值
SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR6, &nbGUA_Char6);
//发送数据
GUA_SimpleGATTprofile_Char6_Notify(nGUA_ConnHandle, nbGUA_Char6, 20);
break;
}
。。。。。。。。。。。。。。。
我改的沁恒代码:
//char6
case SIMPLEPROFILE_CHAR6:
{
//获取连接句柄
GAPRole_GetParameter(paramID, &nGUA_ConnHandle);
//读取 char6 的数值
SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR6, &nbGUA_Char6);
//发送数据
GUA_SimpleGATTprofile_Char6_Notify(nGUA_ConnHandle, nbGUA_Char6, 20);
break;
}
下面说说实际效果
①红框为 app 主动读取到的数值,为默认的 1~20(hex 显示)。
②蓝框为 app 主动写入 cc2541 的数值。
③紫框为cc2541接收到app的数值后,再将char6的数值通过通知发送出来,可见当前char6 的数值已被 app 改变。
上述3步,第一步已实现。
第二步可以主动写入,但是第三步没实现。
用CC2541试验,主动写入后,很快就能收到数据,不用手动读取。
用沁恒板子,主动写入后,收不到数据。需要手动读取。
请大神给看看,哪里出错了?谢谢