我要在這個case裡面一直輪流廣播資料,但是但特定時間點要暫時停止廣播 例如56秒時停止廣播,60秒時又能開始廣播 我該怎麼做呢? 有函示可以用嗎? 或是範例
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我要在這個case裡面一直輪流廣播資料,但是但特定時間點要暫時停止廣播 例如56秒時停止廣播,60秒時又能開始廣播 我該怎麼做呢? 有函示可以用嗎? 或是範例
您好,
加个定时器,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
使用 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
不要在中断上下文中调用 BLE5-Stack API。
建议通过计时器回调内的 BLEAppUtil_invokeFunctionNoData() 调用 GapAdv_disable() 函数:
类似于下面所示的代码:
void timerCallback() { BLEAppUtil_invokeFunctionNoData(yourCustomFunction); return; }
這是我上圖mainThread裡的timercallback的Function 有按照你建議的方式在Timercallback裡使用BLEAppUtil_invokeFunctionNoData(GapAdv_disable(Handle));
但還是一樣會跑進iCall_abort()的while(j)
是我調用的位置不對嗎?
试一下下面这种:
#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 context if(pData[0] == 0x01) { // Handling GapAdv_disable(); } }
另外如果是在自己创建的任务里面调用 GapAdv_disable,需要先注册 iCall 。
前三張圖是我參照你給的方式寫的,但是他到56秒時會跳到第四張圖綠底的部分。
而且在寫的過程中發現以下問題
1.BLEAppUtil_invokeFunctionNoData 只能帶一個參數 並不能用BLEAppUtil_invokeFunctionNoData(myHandlingFunction, pData);
2.GapAdv_disable();必須要帶入Handle參數
3.iCall是用iCall_registerApp註冊嗎? 有註冊的類似範例能參考嗎?
但是如果56秒中斷廣播 過了四秒之後 我要重新啟用廣播 要使用哪個case呢?
我使用圖中這個 中斷時發送 會在我中斷後馬上又啟用
但是我想要讓他中斷四秒後 在60秒時在啟用 我應該怎麼做?
但是我想要讓他中斷四秒後 在60秒時在啟用 我應該怎麼做
试试看加一个计时 4 秒的定时器,让广播在 60 秒时打开。
或者
尝试同时启用两个定时器,一个是 56 秒时关闭广播,一个是 60 秒打开广播。
我目前嘗試了兩種方法:
1.在case BLEAPPUTIL_ADV_START: 判斷當time = 60時 GapAdv_enable ,但遇到的問題是當廣播中斷之後就無法進入case BLEAPPUTIL_ADV_START 也就是廣播無法被重新啟動
2.在case BLEAPPUTIL_ADV_END_AFTER_DISABLE: 判斷當被中斷的時候GapAdv_enable ,但他無法讓我延遲4秒才啟動廣播
您好,
1.
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,是的话开启广播
2.
如果按照您上述的思路,在同一个case里面停止后开启,
需要在case BLEAPPUTIL_ADV_START 里面启动一下 60 秒的定时器。