蓝牙4.0 BLE 数据传输(四)
2018-03-27 12:03
357 查看
4000
原文地址: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_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个时间单位触发一次所以代码该这么写:#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了,
在这里输入1,那么我们的led就亮了,输入其他的数值我们的led就会熄灭。
原文地址: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_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个时间单位触发一次所以代码该这么写:#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了,
在这里输入1,那么我们的led就亮了,输入其他的数值我们的led就会熄灭。
相关文章推荐
- 蓝牙4.0 BLE 数据传输 (一)
- 蓝牙4.0ble 传输数据的一些坑
- 蓝牙4.0 BLE 数据传输 (一)
- 蓝牙4.0 BLE 数据传输 (二)
- 蓝牙4.0 BLE 数据传输(三)
- 蓝牙4.0 BLE 数据传输(五)
- iOS蓝牙4.0(BLE)-后台接收数据
- BLE 数据传输的一些名词
- Android BLE中传输数据的最大长度怎么破
- Android 蓝牙4.0BLE开发实现对蓝牙的写入数据和读取数据
- android:蓝牙4.0的搜索、连接及数据传输(真实可用)——(一)
- iOS 蓝牙4.0(BLE)后台或者锁屏也可以接收数据的方法
- Android 蓝牙4.0BLE开发实现对蓝牙的写入数据和读取数据
- iOS开发—蓝牙4.0(BLE)与外设连接及收发数据的流程
- Android蓝牙4.0BLE通讯读写数据更新
- Android 蓝牙4.0 Bluetooth BLE 写数据(修改BLE设备的属性)
- Android 蓝牙4.0(BLE)开发实现对蓝牙的写入数据和读取数据
- Android BLE中传输数据的最大长度怎么破
- 蓝牙4.0BLE模块的传输速率问题
- android 蓝牙4.0 分包传输数据 问题