想用藍(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,?¬i)?!=?SUCCESS) ????????{ ????????????GATT_bm_free((gattMsg_t?*)¬i,?ATT_HANDLE_VALUE_NOTI); ????????} ????} }
里
if(simpleProfile_Notify(peripheralConnList.connHandle,?¬i)?!=?SUCCESS) ????????{ ????????????GATT_bm_free((gattMsg_t?*)¬i,?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ā)送?
?MTU總是取兩邊的較小值,從機你設(shè)置了40,主機100,min(40,100) = 40.
改函數(shù)定義是不必須的,只需將指針強轉(zhuǎn)為[const] uint8_t*,然后len取2倍就好
BTW,你想一包傳40 bytes,MTU最小為43。
僅供參考。
感謝,已解決