CH582MPeripheral例程问题
uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events)
{
  ...
    if(events & SBP_PERIODIC_EVT)
    {
        if(SBP_PERIODIC_EVT_PERIOD)
        {
            tmos_start_task(Peripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
        }
        performPeriodicTask();
        return (events ^ SBP_PERIODIC_EVT);
    }
  ...
}


static void performPeriodicTask(void)
{
    uint8_t notiData[SIMPLEPROFILE_CHAR4_LEN] = {0x88};
    peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN);
}

static void peripheralChar4Notify(uint8_t *pValue, uint16_t len)
{
    attHandleValueNoti_t noti;
    if(len > (peripheralMTU - 3))
    {
        PRINT("Too large noti\r\n");
        return;
    }
    noti.len = len;
    noti.pValue = GATT_bm_alloc(peripheralConnList.connHandle, ATT_HANDLE_VALUE_NOTI, noti.len, NULL, 0);
    if(noti.pValue)
    {
        tmos_memcpy(noti.pValue, pValue, noti.len);
        if(simpleProfile_Notify(peripheralConnList.connHandle, &noti) != SUCCESS)
        {
            GATT_bm_free((gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI);
        }
    }
}

当BLE调试助手开启Characteristic 4的通知功能 ,上述几个函数将周期向主机发送通知

有几个问题请教各位大神

1、如何触发开启或关闭周期发送通知

2、它是如何知道是gattprofile服务中Characteristic 4 的通知

连接后开启noti的功能是主机在进行,如果主机是手机的话是手机APP进行开启接收的。主机是的CH582M的话可以参考主机例程例程中有开启通知的功能。

else if(centralDiscState == BLE_DISC_STATE_CCCD)
{
if(pMsg->method == ATT_READ_BY_TYPE_RSP &&
pMsg->msg.readByTypeRsp.numPairs > 0)
{
centralCCCDHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0],
pMsg->msg.readByTypeRsp.pDataList[1]);
centralProcedureInProgress = FALSE;

// Start do write CCCD
tmos_start_task(centralTaskId, START_WRITE_CCCD_EVT, DEFAULT_WRITE_CCCD_DELAY);           //通过这个写任务打开notify

// Display Characteristic 1 handle
PRINT("Found client characteristic configuration handle : %x \n", centralCCCDHdl);
}
centralDiscState = BLE_DISC_STATE_IDLE;
}

从机开启通知的功能:

uint8 enable_notify(uint16 connection_handle,uint8 enable) {
uint16 cccd = 0;
if(enable) {
cccd |= GATT_CLIENT_CFG_NOTIFY;
}else {
cccd &= ~GATT_CLIENT_CFG_NOTIFY;
}
return GATTServApp_WriteCharCfg( connection_handle, simpleProfileChar4Config, cccd );
}

在连接后此函数(Peripheral_LinkEstablished)调用就可以了。

如果需要修改定时发送可以修改本事件。

 if(events & SBP_PERIODIC_EVT)
    {
        if(SBP_PERIODIC_EVT_PERIOD)
        {
            tmos_start_task(Peripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD);
        }
        performPeriodicTask();
        return (events ^ SBP_PERIODIC_EVT);
    }


问题二:你使用的手机APP此处查询服务是APP完成的可以参考本链接的APP的demo

https://www.wch.cn/downloads/WCHBleLib_MultiOS_ZIP.html


icon_jpg.gif1692146558884.png

RB_IER_RESET 此位是将整个串口功能关闭还是只是禁止R8_UARTx_IER单个寄存器


只有登录才能回复,可以选择微信账号登录