1. 程式人生 > >藍芽4.0 BLE 資料傳輸(四)

藍芽4.0 BLE 資料傳輸(四)

原文地址: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的巨集關了,藍芽4.0 <wbr>BLE <wbr> <wbr>資料傳輸(四)新增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
);    return ( events ^ SBP_START_DEVICE_EVT );  }  if ( events & MYTASCK_EVENT)  {    //重新啟動計時器    if ( MY_TASCK_EVT_PERIOD)    {      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, MY_TASCK_EVT_PERIOD);    }    //執行自己的任務    mytasck();    return (events ^ MYTASCK_EVENT);  }void mytasck()
{uint8 valueToCopy; uint8 stat;   stat = SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR3, &valueToCopy);   if(valueToCopy == 0x01)  {  P1_0 = 1;  P1_1 = 1;  } else {  P1_0 = 0;   P1_1 = 0;  }}就這樣,編譯以後把程式燒到板子裡面就ok了,藍芽4.0 <wbr>BLE <wbr> <wbr>資料傳輸(四)

藍芽4.0 <wbr>BLE <wbr> <wbr>資料傳輸(四)在這裡輸入1,那麼我們的led就亮了,輸入其他的數值我們的led就會熄滅。