藍芽4.0 BLE 資料傳輸(四)
阿新 • • 發佈:2019-01-29
原文地址:http://blog.sina.com.cn/s/blog_869234dc0102uxos.html
今天我們做一個簡單的資料傳輸實驗,就是用TI提供的lightblue 來點亮控制LED
首先我們來看一下用手機APP來控制led,我是用app來控制cc2540這個模組,那麼我的模組就是從機,從機一般都是service,那麼手機就是主機,是client。這個很簡單,我沒有用協議棧裡面的hal_led,因為我看了,這個很麻煩,明明兩句話的事情非搞得那麼複雜,廢話不說直接來分析。開啟cc2540協議棧中的例子SimpleBLEPeripheral.eww。首先我們得把hal_led的巨集關了,新增HAL_LED=FALSE,這樣 BLE協議棧裡面的HAL_LED就算是廢了。接下來看我的,首先對led初始化,這個就簡單了,就是和我們的51是一樣的,我是在InitBoard函式裡面新增的led初始化: P1DIR |= 0x02; //設定P1_0,P1_1的io為輸出模式 P1_0 = 0; //關閉led1 P1_1 = 0; //關閉led2就這樣初始化搞定了,下面我們就回顧一下,client向主機發送資料用的是write,就是手機把資料寫進cc2540裡面去。在我們的lightblue這個軟體裡,characteristic3有些的屬性。因此我們就可以更改一下原始碼。首先我們定義我們的任務事件#define MYTASCK_EVENT 0x0002;定義完以後我們得觸發事件啊 對吧?那我們就在SBP_START_DEVICE_EVT (自己定義的SimpleBLEPeripheral_Init 這個事件 用的是osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );這個函式觸發我們的SimpleBLEPeripheral_Init 事件) 事件裡面進行操作。那麼我們該如何觸發自己定義的 mytasckevent 事件呢?在這之前我們得介紹一下新的api osal_start_timerExosal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+ (osal_rand() & 0x00FF)) );該函式是每隔5s顯示一次,去掉後,節點加入網路後,只顯示一次,就是說這個函式但是一個定時出發的函式,每隔(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+ (osal_rand() & 0x00FF)) 這麼長時間就會執行SAMPLEAPP_SEND_PERIODIC_MSG_EVT觸發的函式我們可以500個時間單位觸發一次所以程式碼該這麼寫:#define MY_TASCK_EVT_PERIOD 500 if ( events & SBP_START_DEVICE_EVT ) { // Start the Device VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs ); // Start Bond Manager VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs ); // Set timer for first periodic event osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, MY_TASCK_EVT_PERIOD在這裡輸入1,那麼我們的led就亮了,輸入其他的數值我們的led就會熄滅。