使用GATT_WriteLongCharDesc出现BLEPending异常 急

           

// 定义长特征值写入请求
            attPrepareWriteReq_t req;
            uint8_t taskId = centralTaskId; // 任务ID,用于接收通知
            // 初始化数据
            uint8_t data[22];
            snprintf((char *)data, sizeof(data), "%02X%02X%02X%02X%02X%02X",
                     macAddress[0], macAddress[1], macAddress[2],
                     macAddress[3], macAddress[4], macAddress[5]);
            for (int i = 0; i < 6; i++)
            {
                data[i + 12] = formatted[i];
            }
            for (int i = 0; i < 3; i++)
            {
                data[i + 18] = c_bat[i];
            }
            uint16_t data_len = sizeof(data) - 1;    // 获取数据长度(去掉末尾的'\0')
            uint16_t offset = 0;                     // 偏移量初始为0
            uint16_t connHandle = centralConnHandle; // 连接句柄
            // 分段写入,直至数据全部发送完
            while (offset < data_len)
            {
                 DelayMs(2000);
                // 设置请求参数
                req.handle = centralCCCDHdl;                                                                 // 目标句柄
                req.offset = offset;                                                                         // 当前片段的偏移量
                req.len = (data_len - offset > ATT_MTU_SIZE - 5) ? (ATT_MTU_SIZE - 5) : (data_len - offset); // 每次发送最大为 ATT_MTU_SIZE - 5
                req.pValue = &data[data_len];                                                                  // 指向当前偏移的数据
                printf("Request Handle: %u\r\n", req.handle);
                printf("Request Offset: %u\r\n", req.offset);
                printf("Request Length: %u\r\n", req.len);
                // 打印指向的数据内容,根据数据长度逐字节输出
                printf("Request Data: ");
                for (int i = 0; i < req.len; i++)
                {
                    printf("%02X ", req.pValue[i]);
                }
                printf("\r\n");
                // 发送写请求
                bStatus_t status = GATT_WriteLongCharDesc(connHandle, &req, taskId);
                switch (status)
                {
                case SUCCESS:
                    printf("请求已成功发送。\r\n");
                    break;
                case INVALIDPARAMETER:
                    printf("参数无效:请检查连接句柄和请求字段。\r\n");
                    // 可以在此处进行参数检查或调试
                    break;
                case MSG_BUFFER_NOT_AVAIL:
                    printf("没有可用的HCI缓冲区:可能需要重试或释放资源。\r\n");
                    // 可以在此处添加重试机制或释放资源
                    break;
                case bleNotConnected:
                    printf("连接已断开:确保连接已建立后再发送请求。\r\n");
                    // 重新建立连接或通知上层连接问题
                    break;
                case blePending:
                    printf("服务器已存在未完成的响应:请等待之前的响应完成。\r\n");
                    // 等待或添加队列机制来处理请求
                    break;
                case bleMemAllocError:
                    printf("内存分配错误:请检查系统内存情况。\r\n");
                    // 检查内存使用,可能需要清理内存
                    break;
                case bleTimeout:
                    printf("之前的事务超时:可能需要重试或检查连接稳定性。\r\n");
                    // 增加重试逻辑或检查连接状态
                    break;
                default:
                    printf("未知错误状态:%d\r\n", status);
                    // 捕获其他未知状态
                    break;
                }
                if (status == SUCCESS)
                {
                    // 更新偏移量
                    offset += req.len;
                }
                else
                {
                    // 如果写请求失败,退出循环
                    break;
                }
            }



代码如上,20s触发一次发送事件,这个data长度可以连续发送两次GATT_WriteLongCharDesc,反正每次发送事件第一次执行GATT_WriteLongCharDesc成功发送数据,第二次执行GATT_WriteLongCharDesc异常blePending,我也没找到这个函数的使用示例


 蓝牙工程里面不要加任何的延时函数,会导致蓝牙的收发受到影响。

建议通过tmos任务去执行需要延时的任务:

WCH TMOS用法详解 - debugdabiaoge - 博客园

其次建议用GATT_WriteCharValue函数。

针对pending的解决方式:

BLE从机讲解(14)_Pending - SweetTea_lllpc - 博客园


那我想问一下 我要发送的是 mac地址+电量+温湿度值,也能用`GATT_WriteCharValue`  我用例程的时候 是一个一个字节发送,不满足我的要求


修改长度后并填入你的数据。

image.png


这个数据长度 有限制吗  如果我发送超过这个限制该怎么调用,因为我的应用场景是个多个CH592给一个设备发送长数据,所以我要知道是哪个CH592发送过来的

所以有发送长数据的例程吗 发送的数据是这样的 001A2B3C4D5E331551331


len改成你需要发送的长度,然后修改数据内容。

image.png


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