使用GATT_WriteLongCharDesc出現(xiàn)BLEPending異常 急

? ? ? ? ? ?

//?定義長(zhǎng)特征值寫入請(qǐng)求
????????????attPrepareWriteReq_t?req;
????????????uint8_t?taskId?=?centralTaskId;?//?任務(wù)ID,用于接收通知
????????????//?初始化數(shù)據(jù)
????????????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;????//?獲取數(shù)據(jù)長(zhǎng)度(去掉末尾的'\0')
????????????uint16_t?offset?=?0;?????????????????????//?偏移量初始為0
????????????uint16_t?connHandle?=?centralConnHandle;?//?連接句柄
????????????//?分段寫入,直至數(shù)據(jù)全部發(fā)送完
????????????while?(offset?<?data_len)
????????????{
?????????????????DelayMs(2000);
????????????????//?設(shè)置請(qǐng)求參數(shù)
????????????????req.handle?=?centralCCCDHdl;?????????????????????????????????????????????????????????????????//?目標(biāo)句柄
????????????????req.offset?=?offset;?????????????????????????????????????????????????????????????????????????//?當(dāng)前片段的偏移量
????????????????req.len?=?(data_len?-?offset?>?ATT_MTU_SIZE?-?5)???(ATT_MTU_SIZE?-?5)?:?(data_len?-?offset);?//?每次發(fā)送最大為?ATT_MTU_SIZE?-?5
????????????????req.pValue?=?&data[data_len];??????????????????????????????????????????????????????????????????//?指向當(dāng)前偏移的數(shù)據(jù)
????????????????printf("Request?Handle:?%u\r\n",?req.handle);
????????????????printf("Request?Offset:?%u\r\n",?req.offset);
????????????????printf("Request?Length:?%u\r\n",?req.len);
????????????????//?打印指向的數(shù)據(jù)內(nèi)容,根據(jù)數(shù)據(jù)長(zhǎng)度逐字節(jié)輸出
????????????????printf("Request?Data:?");
????????????????for?(int?i?=?0;?i?<?req.len;?i++)
????????????????{
????????????????????printf("%02X?",?req.pValue[i]);
????????????????}
????????????????printf("\r\n");
????????????????//?發(fā)送寫請(qǐng)求
????????????????bStatus_t?status?=?GATT_WriteLongCharDesc(connHandle,?&req,?taskId);
????????????????switch?(status)
????????????????{
????????????????case?SUCCESS:
????????????????????printf("請(qǐng)求已成功發(fā)送。\r\n");
????????????????????break;
????????????????case?INVALIDPARAMETER:
????????????????????printf("參數(shù)無(wú)效:請(qǐng)檢查連接句柄和請(qǐng)求字段。\r\n");
????????????????????//?可以在此處進(jìn)行參數(shù)檢查或調(diào)試
????????????????????break;
????????????????case?MSG_BUFFER_NOT_AVAIL:
????????????????????printf("沒(méi)有可用的HCI緩沖區(qū):可能需要重試或釋放資源。\r\n");
????????????????????//?可以在此處添加重試機(jī)制或釋放資源
????????????????????break;
????????????????case?bleNotConnected:
????????????????????printf("連接已斷開:確保連接已建立后再發(fā)送請(qǐng)求。\r\n");
????????????????????//?重新建立連接或通知上層連接問(wèn)題
????????????????????break;
????????????????case?blePending:
????????????????????printf("服務(wù)器已存在未完成的響應(yīng):請(qǐng)等待之前的響應(yīng)完成。\r\n");
????????????????????//?等待或添加隊(duì)列機(jī)制來(lái)處理請(qǐng)求
????????????????????break;
????????????????case?bleMemAllocError:
????????????????????printf("內(nèi)存分配錯(cuò)誤:請(qǐng)檢查系統(tǒng)內(nèi)存情況。\r\n");
????????????????????//?檢查內(nèi)存使用,可能需要清理內(nèi)存
????????????????????break;
????????????????case?bleTimeout:
????????????????????printf("之前的事務(wù)超時(shí):可能需要重試或檢查連接穩(wěn)定性。\r\n");
????????????????????//?增加重試邏輯或檢查連接狀態(tài)
????????????????????break;
????????????????default:
????????????????????printf("未知錯(cuò)誤狀態(tài):%d\r\n",?status);
????????????????????//?捕獲其他未知狀態(tài)
????????????????????break;
????????????????}
????????????????if?(status?==?SUCCESS)
????????????????{
????????????????????//?更新偏移量
????????????????????offset?+=?req.len;
????????????????}
????????????????else
????????????????{
????????????????????//?如果寫請(qǐng)求失敗,退出循環(huán)
????????????????????break;
????????????????}
????????????}



代碼如上,20s觸發(fā)一次發(fā)送事件,這個(gè)data長(zhǎng)度可以連續(xù)發(fā)送兩次GATT_WriteLongCharDesc,反正每次發(fā)送事件第一次執(zhí)行GATT_WriteLongCharDesc成功發(fā)送數(shù)據(jù),第二次執(zhí)行GATT_WriteLongCharDesc異常blePending,我也沒(méi)找到這個(gè)函數(shù)的使用示例


?藍(lán)牙工程里面不要加任何的延時(shí)函數(shù),會(huì)導(dǎo)致藍(lán)牙的收發(fā)受到影響。

建議通過(guò)tmos任務(wù)去執(zhí)行需要延時(shí)的任務(wù):

WCH TMOS用法詳解 - debugdabiaoge - 博客園

其次建議用GATT_WriteCharValue函數(shù)。

針對(duì)pending的解決方式:

BLE從機(jī)講解(14)_Pending - SweetTea_lllpc - 博客園


那我想問(wèn)一下 我要發(fā)送的是 mac地址+電量+溫濕度值,也能用`GATT_WriteCharValue`? 我用例程的時(shí)候 是一個(gè)一個(gè)字節(jié)發(fā)送,不滿足我的要求


修改長(zhǎng)度后并填入你的數(shù)據(jù)。

image.png


這個(gè)數(shù)據(jù)長(zhǎng)度 有限制嗎? 如果我發(fā)送超過(guò)這個(gè)限制該怎么調(diào)用,因?yàn)槲业膽?yīng)用場(chǎng)景是個(gè)多個(gè)CH592給一個(gè)設(shè)備發(fā)送長(zhǎng)數(shù)據(jù),所以我要知道是哪個(gè)CH592發(fā)送過(guò)來(lái)的

所以有發(fā)送長(zhǎng)數(shù)據(jù)的例程嗎 發(fā)送的數(shù)據(jù)是這樣的?001A2B3C4D5E331551331


len改成你需要發(fā)送的長(zhǎng)度,然后修改數(shù)據(jù)內(nèi)容。

image.png


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频