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:
好的,不客气。