今天我们做一个简单的数据传输实验,就是用TI提供的lightblue 来点亮控制LED
首先我们来看一下用手机APP来控制led,我是用app来控制cc2540这个模块,那么我的模块就是从机,从机一般都是service,那么手机就是主机,是client。
这个很简单,我没有用协议栈里面的hal_led,因为我看了,这个很麻烦,明明两句话的事情非搞得那么复杂,废话不说直接来分析。打开cc2540协议栈中的例子SimpleBLEPeripheral.eww。
首先我们得把hal_led的宏关了,
定义完以后我们得触发事件啊 对吧?
那我们就在SBP_START_DEVICE_EVT (自己定义的SimpleBLEPeripheral_Init 这个事件 用的是
osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );这个函数触发我们的SimpleBLEPeripheral_Init 事件) 事件里面进行操作。
那么我们该如何触发自己定义的 mytasckevent 事件呢?
在这之前我们得介绍一下新的api osal_start_timerEx
osal_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个时间单位触发一次所以代码该这么写:
if ( events & SBP_START_DEVICE_EVT )
{
// Start the Device
VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );
// Start Bond ManagerVOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );// Set timer for first periodic eventosal_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了,
在这里输入1,那么我们的led就亮了,输入其他的数值我们的led就会熄灭。
联系客服