GATT_Notification總返回0x16導致發(fā)送速度很慢

你好 使用GATT_Notification發(fā)送數(shù)據(jù),這個函數(shù)經(jīng)常返回0x16,就是blePending,導致發(fā)送1K數(shù)據(jù)都要幾秒鐘的時間,請問有什么辦法可以提升發(fā)送速度呢?

補充:MTU設(shè)置為了23,每包只發(fā)送20字節(jié)數(shù)據(jù),如果MTU設(shè)置為最大值,蘋果手機會支持嗎?


蘋果手機需要查看APP是否支持,nrfconnect是可以修改MTU的。

其次可以將藍牙的連接間隔配置小一些,這樣發(fā)包的速度會加快。

如果出現(xiàn)pending的返回值,可以過10ms再次發(fā)送函數(shù)進行發(fā)送。


請問出現(xiàn)blepending后,等待2s在傳輸還是blepending,有什么辦法解決blepending嘛。因為我現(xiàn)在是blepending之后,就會出現(xiàn)藍牙無數(shù)據(jù)交互而斷開連接


出現(xiàn)pending是因為底層的收發(fā)接口函數(shù)的緩存不夠,所以數(shù)據(jù)發(fā)送不成功且顯示需等待??梢宰鋈缦碌牟僮鳎?

①將config.h文件中的BLE_BUFF_NUM參數(shù)給大一些,默認是5,可以配置為10;

②過10ms再進行調(diào)用發(fā)送函數(shù);

③如果一直調(diào)用發(fā)送函數(shù)且一直出現(xiàn)pending,建議看下你的函數(shù)發(fā)送失敗的時候有沒有釋放緩存。可能是發(fā)送函數(shù)失敗并且不釋放緩存,導致緩存一直不夠;

image.png

④如果是使用的測速例程,建議看一下你自己改了那些參數(shù),并修改為之前的參數(shù),對比測試是否出現(xiàn)pending問題。原始的例程我們測試過是沒有pending的情況的;

⑤出現(xiàn)reason8的斷開,大概率是有任務(wù)操作時間過長,導致藍牙沒有收發(fā)窗口導致斷開。可以先將你自己的代碼去掉進行測試。連接間隔需要配置為最大任務(wù)時長的2倍。提供一份博客參考:

藍牙BLE從機Peripheral講解一(廣播間隔和連接間隔) - SweetTea_lllpc - 博客園 (cnblogs.com)

⑥一個問題發(fā)一個帖子描述清楚就行了,看到會回復的。


好的,謝謝。

  1. 我測試了兩個程序。一個是基于peripheral例程改的,一個用的是測速例程。在我使用測速例程的時候,不修改代碼,只是把MTU改成了70,然后放在那里靜置一段時間,就會出現(xiàn)pending然后出現(xiàn)reason8的斷連。更極端一段,還是測速例程,不修改代碼,把MTU改成240,放一會兒就會出現(xiàn)pending然后出現(xiàn)reason8的斷連

  2. 基于peripheral例程改的話,連接間隔,我現(xiàn)在設(shè)置的是120ms以上,沒有超過60ms的單個任務(wù)。正常靜置不動發(fā)送沒有問題,藍牙正常,但是我有個外部中斷,大概60ms觸發(fā)一次,一旦開始工作,就很容易出現(xiàn)blepending。請問外部中斷會影響藍牙發(fā)送的情況嘛

  3. 我修改的參數(shù)包括下面幾個:

    BLE_BUFF_MAX_LEN? ? ? ? ? ? ? ? ? ? 70

    BLE_BUFF_NUM? ? ? ? ? ? ? ? ? ? ? ? 10

    BLE_TX_NUM_EVENT? ? ? ? ? ? ? ? ? ? 6

  4. 我釋放緩存了,那里我是用的例程的代碼,有沒有釋放緩存失敗的可能

  5. 我目前有個疑問,就是每次連接事件來的時候,從機和數(shù)據(jù)發(fā)送數(shù)據(jù)會清空控制器的緩存區(qū)嘛。比如我設(shè)置1s調(diào)用兩次GATT_notification,我的緩沖區(qū)是10,每次最多傳輸6個包。那么我的理解就是,每個連接事件來的時候,可以一次性最多清除6個數(shù)據(jù)包,那我應該不會出現(xiàn)blepending才對,但是事實上我還是會出現(xiàn)blepending。所以這個緩沖區(qū)是如何清空數(shù)據(jù)包發(fā)送的?


①修改speedtest的MTU,需要同時修改noti發(fā)送的數(shù)據(jù)長度。默認的發(fā)送長度是244B,如果將MTU改小,則會堆在了緩存中。如果是測速則可以參考speedtest,其他功能開發(fā)建議參考BLE_UART或者peripheral例程;
②釋放緩存可以查看返回值判斷是否成功;
③我們這里測試配置定時器10ms中斷并翻轉(zhuǎn)PB4,藍牙noti100ms周期,長度100B,測試沒有連接斷開的情況,會偶爾出現(xiàn)pending的情況。

1.png

操作中斷要求快進快出,所以我們會將服務(wù)函數(shù)放在RAM中運行??梢栽谥袛嗬锩嬷脴酥净蛘叻D(zhuǎn)GPIO,如果調(diào)用函數(shù)需要加上highcode。如果調(diào)用的函數(shù)過多,建議通過標志,另外開一個tmos查詢該任務(wù)。

④如果配置了MTU后,需要手機端APP連接也修改MTU的;

⑤noti發(fā)送成功會由底層清除緩存,發(fā)送失敗需要手動清除緩存。失敗后需要手動重新調(diào)用發(fā)送函數(shù);

⑥測試有問題的話,發(fā)送郵件到郵箱lpc@wch.cn,我提供一下測試的代碼,可以對比看下。


好的,謝謝,目前我這個正常工作了。請問您在第三點里面提到測試,每次發(fā)送的數(shù)據(jù)是多少。我是1s調(diào)用一次發(fā)送,每次發(fā)送會連續(xù)兩次調(diào)用gatt_notification,每個數(shù)據(jù)都是70Bytes


100ms調(diào)用一次noti發(fā)送100字節(jié)。


好的,謝謝。您說測試的時候,偶爾會出現(xiàn)blepending,請問出現(xiàn)blepending您是怎么處理的,手動釋放內(nèi)存之后下一次就還是正常發(fā)送嘛


發(fā)送失敗,例程是有釋放緩存,然后直接再次發(fā)送數(shù)據(jù)就可以了。


好的,謝謝


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

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