TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2340R5: 藍芽暫時停止廣播

Part Number:CC2340R5

我要在這個case裡面一直輪流廣播資料,但是但特定時間點要暫時停止廣播 例如56秒時停止廣播,60秒時又能開始廣播 我該怎麼做呢? 有函示可以用嗎? 或是範例

Yolande Wang:

您好,

加个定时器,56 秒时停止,过了4秒再次开启。

请参阅 BLE5_stack user guide 里的 software timers 部分。

这是 FreeRTOS Software Timer API :https://dev.ti.com/tirex/explore/node?node=A__AORV2P9xKyaQCr.Dunw8Rg__com.ti.SIMPLELINK_LOWPOWER_F3_SDK__58mgN04__LATEST

,

Ryan:

謝謝! 我停止廣播是用這個GapAdv_disable(uint8 handle); Function是做停止廣播的動作嗎?

,

Yolande Wang:

Ryan 说:用這個GapAdv_disable(uint8 handle); Function是做停止廣播的動作嗎

对的。

请参考 gap_advertiser.h File Reference。

,

Ryan:

但是我56秒時,停止廣播 會跑到ICall_abort(void)裡的while(j) 不會繼續計時下去 請問有方法可解嗎

,

Yolande Wang:

使用 GapAdv_disable(uint8 handle);  这个函数时,注意不要在 callback里面调用。

另外,请您参阅 ICall_abort 部分:https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_10_02_23/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/debugging-index.html#icall-abort

,

Ryan:

我寫在Thread裡面一樣會進到icall_abort() 但是寫在int main()裡面會變成沒有中斷的效果,會繼續廣播

,

Yolande Wang:

不要在中断上下文中调用 BLE5-Stack API。

建议通过计时器回调内的 BLEAppUtil_invokeFunctionNoData() 调用 GapAdv_disable() 函数:

类似于下面所示的代码:

void timerCallback()
{BLEAppUtil_invokeFunctionNoData(yourCustomFunction);return;
}

,

Ryan:

這是我上圖mainThread裡的timercallback的Function 有按照你建議的方式在Timercallback裡使用BLEAppUtil_invokeFunctionNoData(GapAdv_disable(Handle));但還是一樣會跑進iCall_abort()的while(j) 是我調用的位置不對嗎?

,

Yolande Wang:

试一下下面这种:

#include <icall.h>
#include <ti/bleapp/ble_app_util/inc/bleapputil_api.h>void myHandlingFunction( char *pData );void myUARTCallback(void)
{
// The following is executed in a callback / SWi / HWI context
char *pData = ICall_malloc(sizeof(char));if(pData == NULL)
{
return;
}pData[0] = 0x01;BLEAppUtil_invokeFunctionNoData(myHandlingFunction, pData);
}void myHandlingFunction( char *pData )
{
// The following will be executed in a task contextif(pData[0] == 0x01)
{
// Handling
GapAdv_disable();
}
}

另外如果是在自己创建的任务里面调用 GapAdv_disable,需要先注册 iCall 。

,

Ryan:

前三張圖是我參照你給的方式寫的,但是他到56秒時會跳到第四張圖綠底的部分。

而且在寫的過程中發現以下問題1.BLEAppUtil_invokeFunctionNoData 只能帶一個參數 並不能用BLEAppUtil_invokeFunctionNoData(myHandlingFunction, pData);2.GapAdv_disable();必須要帶入Handle參數

3.iCall是用iCall_registerApp註冊嗎? 有註冊的類似範例能參考嗎?

,

Yolande Wang:

可以看下这个链接:https://dev.ti.com/tirex/explore/content/simplelink_lowpower_f3_sdk_7_40_00_64/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/the-application-cc23xx.html#icall-initialization-and-registration

,

Ryan:

感謝 找到方法解決了 我把GapAdv_disable 的判斷移到GapAdv_prepareLoadByBuffer的上面先判斷 就可以成功停止廣播

,

Yolande Wang:

感谢反馈,问题解决了就好。

,

Ryan:

但是如果56秒中斷廣播 過了四秒之後 我要重新啟用廣播 要使用哪個case呢?我使用圖中這個 中斷時發送 會在我中斷後馬上又啟用但是我想要讓他中斷四秒後 在60秒時在啟用 我應該怎麼做?

,

Yolande Wang:

Ryan 说:但是我想要讓他中斷四秒後 在60秒時在啟用 我應該怎麼做

试试看加一个计时 4 秒的定时器,让广播在 60 秒时打开。

或者

尝试同时启用两个定时器,一个是 56 秒时关闭广播,一个是 60 秒打开广播。

,

Ryan:

我目前嘗試了兩種方法:1.在case BLEAPPUTIL_ADV_START: 判斷當time = 60時 GapAdv_enable ,但遇到的問題是當廣播中斷之後就無法進入case BLEAPPUTIL_ADV_START 也就是廣播無法被重新啟動2.在case BLEAPPUTIL_ADV_END_AFTER_DISABLE: 判斷當被中斷的時候GapAdv_enable ,但他無法讓我延遲4秒才啟動廣播

,

Yolande Wang:

您好,

1.

Ryan 说:1.在case BLEAPPUTIL_ADV_START: 判斷當time = 60時 GapAdv_enable ,但遇到的問題是當廣播中斷之後就無法進入case BLEAPPUTIL_ADV_START 也就是廣播無法被重新啟動

中断之后进入 disable 的case了,肯定不会再执行下面的开启广播代码。

如果您只开启一个定时器,请您按照以下代码的流程进行:

int time=0;

time++;

case start:

  判断 time 是否 = 56 ,是的话关掉广播;

case stop:

  判断 time 是否 = 60,是的话开启广播

,

Yolande Wang:

2.

如果按照您上述的思路,在同一个case里面停止后开启,

需要在case BLEAPPUTIL_ADV_START 里面启动一下 60 秒的定时器。

,

Ryan:

感謝 已解決 的確要在disable處理啟動廣播 當他偵測到中斷後進入case disable,sleep4秒後再啟動就可以了

,

Yolande Wang:

好的,不客气。

赞(0)
未经允许不得转载:TI中文支持网 » CC2340R5: 藍芽暫時停止廣播
分享到: 更多 (0)