// 定义长特征值写入请求 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,我也没找到这个函数的使用示例
热门产品 :
CH32V317: 互联型青稞RISC-V MCU