CH573MultiCentral和Perrpheral接收數(shù)據(jù)不正常

首先從機(jī)和主機(jī)的gattprofile.h文件中的?SIMPLEPROFILE_CHAR1_LEN均改為了5,但接受時(shí)只有第一個(gè)數(shù)據(jù)正確,請(qǐng)大佬指教!謝謝?。?!

發(fā)送函數(shù):

uint8?BLE_Send_Txt[5]={10,15,32,86,65};
static?uint16?connect0_ProcessEvent(?uint8?task_id,?uint16?events?)
{
if?(?events?&?START_READ_OR_WRITE_EVT?)
{???
if(?centralConnList[CONNECT0_ITEM].procedureInProgress?==?FALSE?)
{
if(?centralDoWrite?)
{
//?Do?a?write
??attPrepareWriteReq_t?req;
req.handle?=?centralConnList[CONNECT0_ITEM].charHdl;
req.len?=?SIMPLEPROFILE_CHAR1_LEN;
req.pValue?=?GATT_bm_alloc(centralConnList[CONNECT0_ITEM].connHandle,ATT_WRITE_REQ,req.len,NULL,0);
if?(?req.pValue?!=?NULL?)
{
*req.pValue?=?BLE_Send_Txt[0];
if(?GATT_WriteLongCharValue(centralConnList[CONNECT0_ITEM].connHandle,&req,centralTaskId)?==?SUCCESS?)
{??????
centralConnList[CONNECT0_ITEM].procedureInProgress?=?TRUE;
centralDoWrite?=?!centralDoWrite;
tmos_start_task(?centralConnList[CONNECT0_ITEM].taskID,?START_READ_OR_WRITE_EVT,?DEFAULT_READ_OR_WRITE_DELAY);
}
else
{
GATT_bm_free((gattMsg_t?*)&req,?ATT_WRITE_REQ);
}
}??
}

接收方是這樣的

uint8?txt[SIMPLEPROFILE_CHAR1_LEN];
static?void?simpleProfileChangeCB(?uint8?paramID,?uint8?*pValue,?uint16?len?)
{
??switch(?paramID?)
??{
????case?SIMPLEPROFILE_CHAR1:
{
??????tmos_memcpy(?txt,?pValue,?len?);
PRINT("profile?ChangeCB?CHAR1..?\n");
??????break;
}
????case?SIMPLEPROFILE_CHAR3:
{
??????tmos_memcpy(?txt,?pValue,?len?);
PRINT("profile?ChangeCB?CHAR3..\n");
??????break;
}
????default:
??????//?should?not?reach?here!
??????break;
??}
}


但調(diào)試結(jié)果是這樣的:QQ截圖20211205132844.jpg


熱門(mén)產(chǎn)品 : USB3.0 HUB控制器:CH634

wch的ble 協(xié)議棧里面,大量的使用了動(dòng)態(tài)內(nèi)存, 其中數(shù)據(jù)的傳輸就需要用到.?

在發(fā)送前,需要調(diào)用GATT_bm_alloc 函數(shù),然后傳入相關(guān)參數(shù)申請(qǐng)內(nèi)存,如果內(nèi)存申請(qǐng)成功,再把要傳輸?shù)臄?shù)據(jù)拷貝進(jìn)去,然后再調(diào)用gatt的相關(guān)傳輸函數(shù)傳輸數(shù)據(jù).


在你的代碼里面,你申請(qǐng)內(nèi)存成功后(req.pValue != NULL),

對(duì)內(nèi)存賦值用的是:

*req.pValue?=?BLE_Send_Txt[0];

學(xué)過(guò)c語(yǔ)言的我們都知道, 這是一句的結(jié)果等價(jià)于:

req.pValue[0] =?BLE_Send_Txt[0];??

僅此而已,

所以,你說(shuō)的5個(gè)byte就第一個(gè)byte正常,是合理的.


上面的代碼,如果需要5個(gè)byte都正常,下面的代碼可以任選一種:

1, 當(dāng)數(shù)組操作,循環(huán)賦值:

for(uint32_t i=0;i<5;i++) {

? ??req.pValue[i] =?BLE_Send_Txt[i];?

}

2,調(diào)用標(biāo)準(zhǔn)庫(kù)內(nèi)存copy:

memcpy(req.pValue,BLE_Send_Txt,5);

3,使用協(xié)議棧提供的內(nèi)存copy函數(shù):

tmos_memcpy(req.pValue,BLE_Send_Txt,5);




謝謝大哥,終于成功了,謝謝您?。?!


順便問(wèn)一下大佬,這個(gè)讀程序,讀出來(lái)的結(jié)果是不是放到了req.pValue中,是不是像發(fā)送一樣把數(shù)據(jù)搬出來(lái)就可以了,
如memcpy(req.pValue,BLE_Send_Txt,5);

else
{
//?Do?a?read
attReadReq_t?req;??
req.handle?=?centralConnList[CONNECT0_ITEM].charHdl;????????
if(?GATT_ReadCharValue(?centralConnList[CONNECT0_ITEM].connHandle,?&req,?centralTaskId?)?==?SUCCESS?)
{
centralConnList[CONNECT0_ITEM].procedureInProgress?=?TRUE;
centralDoWrite?=?!centralDoWrite;
}
}



read ,是有個(gè)過(guò)程的, 并不能立刻得到結(jié)果,


兄弟,能發(fā)一下,你的例程給我看一下嗎,我是發(fā)一個(gè)數(shù)據(jù)正常,發(fā)多個(gè)數(shù)據(jù)就異常,420358111@QQ.com


如果是APP連接peripheral例程,默認(rèn)是開(kāi)啟的1個(gè)字節(jié)長(zhǎng)度,如果需要多字節(jié),可以將這里的長(zhǎng)度給大。

image.png

如果超過(guò)20字節(jié),則需要開(kāi)啟MTU:

藍(lán)牙BLE從機(jī)Peripheral講解十二(MTU) - SweetTea_lllpc - 博客園


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

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