藍(lán)牙發(fā)送數(shù)據(jù)問題

想用藍(lán)牙發(fā)送ADC數(shù)據(jù),但是只能發(fā)單字節(jié),ADC值發(fā)不全,該如何修改配置?

修改部分代碼可以雙字節(jié)發(fā)全,但是信息會丟失第一個數(shù)據(jù)的第一個字節(jié),這是為何


想實現(xiàn)功能是接收到特定數(shù)據(jù)就藍(lán)牙發(fā)送ADC值,但是現(xiàn)在是在CHAR1接收數(shù)據(jù),在CHAR4發(fā)送數(shù)據(jù),現(xiàn)在雙字節(jié)發(fā)送出現(xiàn)的問題是,手機在APP讀CHAR4數(shù)據(jù),只有20個字節(jié)而且丟失第一個數(shù)據(jù)的第一個字節(jié),我想要的效果應(yīng)該是40個字節(jié)且不丟數(shù)據(jù),這個20字節(jié)是誰限制的?我修改#define SIMPLEPROFILE_CHAR4_LEN???? 40也沒用。


我后面又試著把數(shù)組空出一個來輸出,發(fā)現(xiàn)好像不是數(shù)據(jù)丟失,是高位在后低位在前了,有程序能更改順序嗎,不能更改我就在接收端處理


需要發(fā)送較長數(shù)據(jù)需要修改MTU,除了你上面提到的#define SIMPLEPROFILE_CHAR4_LEN???? 40還需要對config.h中的

#ifndef BLE_BUFF_MAX_LEN

#define BLE_BUFF_MAX_LEN? ? ? ? ? ? ? ? ? ? 27

#endif

進(jìn)行修改。

關(guān)于你說的發(fā)送接收數(shù)據(jù)不全的情況,看你的歷史發(fā)帖程序做出了較大改動,是否可以提供詳細(xì)的信息,比如將你修改的程序部分,打印數(shù)據(jù)出現(xiàn)的現(xiàn)象等。


?BLE_BUFF_MAX_LEN????已經(jīng)修改成為44,和#define SIMPLEPROFILE_CHAR4_LEN???? 40后接收不到任何數(shù)據(jù),#define SIMPLEPROFILE_CHAR4_LEN???? 20時能夠正常接收數(shù)據(jù),數(shù)據(jù)發(fā)送沒有不全,是因為真實發(fā)送的數(shù)據(jù) 高位在后低位在前(這里是因為什么?藍(lán)牙協(xié)議導(dǎo)致的?),我按照一般的想法以為是高位在前低位在后,當(dāng)時認(rèn)為是丟了一個高位數(shù)據(jù),現(xiàn)在看沒有丟失數(shù)據(jù),現(xiàn)在問題還是發(fā)送長度大了,我通過藍(lán)牙通道4發(fā)送出來的數(shù)據(jù)直接不發(fā)送了。


代碼方面我修改的performPeriodicTask函數(shù),

static void performPeriodicTask(void)
{
??? uint8_t i;
??? uint16_t notiData[SIMPLEPROFILE_CHAR4_LEN] ;
??? for(i = 0; i < 20; i++)
??? {
??????? notiData[i] = abcBuff[i]; // 連續(xù)采樣20次

??? }
??? peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN);
}
abcBuff[]是ADC取到的全局變量


我在找原因時發(fā)現(xiàn)是函數(shù)

static?void?peripheralChar4Notify(uint16_t?*pValue,?uint16_t?len)
{
????attHandleValueNoti_t?noti;
????if(len?>?(peripheralMTU?-?3))
????{
????????return;
????}
????noti.len?=?len;
????noti.pValue?=?GATT_bm_alloc(peripheralConnList.connHandle,?ATT_HANDLE_VALUE_NOTI,?noti.len,?NULL,?0);
????if(noti.pValue)
????{
????????tmos_memcpy(noti.pValue,?pValue,?noti.len);
????????if(simpleProfile_Notify(peripheralConnList.connHandle,?&noti)?!=?SUCCESS)
????????{
????????????GATT_bm_free((gattMsg_t?*)&noti,?ATT_HANDLE_VALUE_NOTI);
????????}
????}
}

if(simpleProfile_Notify(peripheralConnList.connHandle,?&noti)?!=?SUCCESS)
????????{
????????????GATT_bm_free((gattMsg_t?*)&noti,?ATT_HANDLE_VALUE_NOTI);
????????}

這一段的問題

bStatus_t?simpleProfile_Notify(uint16_t?connHandle,?attHandleValueNoti_t?*pNoti)
{
????uint16_t?value?=?GATTServApp_ReadCharCfg(connHandle,?simpleProfileChar4Config);

????//?If?notifications?enabled
????if(value?&?GATT_CLIENT_CFG_NOTIFY)
????{
????????PRINT("noti.pValue?open\n");
????????//?Set?the?handle
????????pNoti->handle?=?simpleProfileAttrTbl[SIMPLEPROFILE_CHAR4_VALUE_POS].handle;
????????PRINT("%x\n",GATT_Notification(connHandle,?pNoti,?FALSE));
????????//?Send?the?notification
????????return?GATT_Notification(connHandle,?pNoti,?FALSE);
????}
????return?bleIncorrectMode;
}

修改長度會如何影響這里函數(shù)的結(jié)果?


還有就是這個長度SIMPLEPROFILE_CHAR4_LEN是按字節(jié)算的?我想輸出20個雙字節(jié)數(shù)據(jù)是要改成40吧


接收端MTU改了嗎?MTU總是取兩邊的較小值。


謝謝解答,我測試現(xiàn)在是使用手機APP測試的,APP 修改MTU,我設(shè)置100后提示MTU40,這是為何?還有就是APP修改后還是收不到數(shù)據(jù)


現(xiàn)在問題太多,我想重新開始解決,藍(lán)牙發(fā)送uint8_t 怎么變成發(fā)送uint16_t?我之前是用修改函數(shù)聲明,把入?yún)⒏淖?,目前看來是失敗的,有什么其他的解決辦法嗎?還是就不這樣整個發(fā)送數(shù)據(jù)而是把0x0fff拆成字符'0''F''F''F'發(fā)送?


  1. ?MTU總是取兩邊的較小值,從機你設(shè)置了40,主機100,min(40,100) = 40.

  2. 改函數(shù)定義是不必須的,只需將指針強轉(zhuǎn)為[const] uint8_t*,然后len取2倍就好


BTW,你想一包傳40 bytes,MTU最小為43。


僅供參考。


感謝,已解決


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

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