CH579无法发送长包的问题

用CH579分别做蓝牙的主从机,无论修改config里的MTU最大长度和特征值值可以接受的数据长度都无效,写函数也用了writelongchar,都不能发送超过17个字节的包


debug发现原因在于

 if ( pMsg->method == ATT_READ_BY_TYPE_RSP && 

         pMsg->msg.readByTypeRsp.numPairs > 0 )

    {

      centralCharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.pDataList[0],

                                       pMsg->msg.readByTypeRsp.pDataList[1] );

      

      // Start do read or write

      tmos_start_task( centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);

      

      // Display Characteristic 1 handle

      PRINT("Found Characteristic 1 handle : %x \n",centralCharHdl);      

    }



 pMsg->method这个参数等于ATT_ERROR_RSP导致程序无法进行读特征值句柄

有人来解释一下吗?


邮箱联系沁恒的技术支持,跟人间蒸发了一样

使用我们的例程主机应该是可以发送19个字节,从机可以发送20字节,如果想要更大,那么可以在主机端调用GATT_ExchangeMTU,config.h中也相应修改为251,此时mtu为247。如果没有成功可以发送邮件至hy@wch.cn获取。




GATT_ExchangeMTU也调用了,这个函数在centralHciMTUChangeCB这个里面

直接这样写的   centralHciMTUChangeCB(LINK_CONNECTED,244,244);,然而并没有用

在conncted之后调用了,直接连服务句柄都读不到了,在读到服务句柄后调用依旧是读不到特征值句柄的

请问发送至hy@wch.cn 邮箱获取什么呢?


邮件已发送,请查收,可获取实现长包的例程。


我的也是 pMsg->method 一直是  ATT_ERROR_RSP ,导致不进入读写任务。但我没有发长包,例程主机找到 Service handle 后 就不行了


static void centralGATTDiscoveryEvent(gattMsgEvent_t *pMsg)

{

    attReadByTypeReq_t req;


    if(centralDiscState == BLE_DISC_STATE_SVC)

    {

        printf("%d\r\n",pMsg->method);

        // Service found, store handles

        if(pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&

           pMsg->msg.findByTypeValueRsp.numInfo > 0)

        {

            centralSvcStartHdl = ATT_ATTR_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);

            centralSvcEndHdl = ATT_GRP_END_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);


            // Display Profile Service handle range

            PRINT("Found Profile Service handle : %x ~ %x \n", centralSvcStartHdl, centralSvcEndHdl);

        }

        // If procedure complete

        if((pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&

            pMsg->hdr.status == bleProcedureComplete) ||

           (pMsg->method == ATT_ERROR_RSP))

        {

            if(centralSvcStartHdl != 0)

            {

                // Discover characteristic

                centralDiscState = BLE_DISC_STATE_CHAR;

                req.startHandle = centralSvcStartHdl;

                req.endHandle = centralSvcEndHdl;

                req.type.len = ATT_BT_UUID_SIZE;

                req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR2_UUID);

                req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR2_UUID);


                GATT_ReadUsingCharUUID(centralConnHandle, &req, centralTaskId);

            }

        }

    }

    else if(centralDiscState == BLE_DISC_STATE_CHAR)

    {

        printf("%d\r\n",pMsg->method);

        // Characteristic found, store handle

        if(pMsg->method == ATT_READ_BY_TYPE_RSP &&

           pMsg->msg.readByTypeRsp.numPairs > 0)

        {

            centralCharHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0],

                                          pMsg->msg.readByTypeRsp.pDataList[1]);


            // Start do read or write

            tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);


            // Display Characteristic 1 handle

            PRINT("Found Characteristic 1 handle : %x \n", centralCharHdl);

        }

        if((pMsg->method == ATT_READ_BY_TYPE_RSP &&

            pMsg->hdr.status == bleProcedureComplete) ||

           (pMsg->method == ATT_ERROR_RSP))

        {

            // Discover characteristic

            centralDiscState = BLE_DISC_STATE_CCCD;

            req.startHandle = centralSvcStartHdl;

            req.endHandle = centralSvcEndHdl;

            req.type.len = ATT_BT_UUID_SIZE;

            req.type.uuid[0] = LO_UINT16(GATT_CLIENT_CHAR_CFG_UUID);

            req.type.uuid[1] = HI_UINT16(GATT_CLIENT_CHAR_CFG_UUID);


            GATT_ReadUsingCharUUID(centralConnHandle, &req, centralTaskId);

        }

    }


image.png


你这里只获取到了范围,可以看下主机填写的uuid是否符合从机的uuid。

提供了一份枚举所有服务的demo,可以参考。

或者直接参考该博客的枚举服务函数也可以:

蓝牙BLE主机Central讲解三(服务枚举) - SweetTea_lllpc - 博客园 (cnblogs.com)


好的,十分感谢


ATT_ERR_INSUFFICIENT_AUTHEN(0x05):该属性需要进行身份验证才能被读取或写入。

已经配对密码成功,应该如何进行属性身份验证

这是串口打印的信息

image.png

image.png


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