BLE如何广播一个数值分析数据?譬如ADC值。

CC2541通过按键触发广播数据的变化(动态广播)教程 - 无线通信技术专区 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
CC2541通过按键触发广播数据的变化(动态广播)教程
14:56:21  
CC2541通过按键触发广播数据的变化(动态广播)教程
一、简介本篇以SimpleBLEPeripheral为例,CC2541通过按键触发广播数据的变化,实现按一次按键改变一次广播数据。
二、实验平台协议栈版本:BLE-CC254x-1.3.2编译软件:IAR 8.20.2硬件平台:smart RF开发板
三、动态广播思路1、按键触发进入按键处理事件simpleBLEPeripheral_HandleKeys。2、关闭广播。3、进入SBP_KEY_UPDATE_ADV_EVT事件(自定义),调用GAP_UpdateAdvertisingData修改广播数据。4、开启广播。
四、实验预期现象1、板子上电:广播默认的数据
static uint8 advertData[] =&&{&&&&// F this sets the device to use limited discoverable&&&&// mode (advertises for 30 seconds at a time) instead of general&&&&// discoverable mode (advertises indefinitely)&&&&0x02,& &// length of this data&&&&GAP_ADTYPE_FLAGS,&&&&DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,&&&&&&// service UUID, to notify central devices what services are included&&&&// in this peripheral&&&&0x03,& &// length of this data&&&&GAP_ADTYPE_16BIT_MORE,& && &// some of the UUID's, but not all&&&&LO_UINT16( SIMPLEPROFILE_SERV_UUID ),&&&&HI_UINT16( SIMPLEPROFILE_SERV_UUID ),&&&&};&&
2、按键按1、2、4、5、7、8次……(非3的倍数次)
uint8 advertData_Update[] =&&{&&&&0x07,& &&&//自定义短名的长度&&&&GAP_ADTYPE_LOCAL_NAME_SHORT,&&&&0x47,& &&&//G&&&&0x55,& &&&//U&&&&0x41,& &&&//A&&&&0x3A,& &&&//:&&&&0x20,& &&&//键值&&&&0x00,& &&&//给按键次数预留&&& & &&0x03,& &&&//UUID字段长度&&&&GAP_ADTYPE_16BIT_MORE,& && &// some of the UUID's, but not all&&&&LO_UINT16( SIMPLEPROFILE_SERV_UUID ),&&&&HI_UINT16( SIMPLEPROFILE_SERV_UUID ),&&};&&
第8字节累加。
3、按键按3、6、9次(3的倍数次)
与板子上电时的协议栈默认广播数据一样。
五、代码修改1、按键功能实现(参考博文《CC2541之按键》)
2、创建一个“动态广播”事件1)创建事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent函数中)
if ( events & SBP_KEY_UPDATE_ADV_EVT )& && &&&//按键更新广播事件&&{&&&&&&return (events ^ SBP_KEY_UPDATE_ADV_EVT);&&}&&
2)添加事件的宏定义(SimpleBLEPeripheral.h中)
#define SBP_KEY_UPDATE_ADV_EVT& && && && && && && && && & 0x0008&&
3、动态广播的处理代码
1)定义一个变量用于按键计数
static uint8 key_count = 1;&&
2)按键处理函数
/*********************************************************************
* @fn& && &simpleBLEPeripheral_HandleKeys
* @brief& &Handles all key events for this device.
* @param& &shift - true if in shift/alt.
* @param& &keys - bit field for key events. Valid entries:
*& && && && && &&&HAL_KEY_SW_2
*& && && && && &&&HAL_KEY_SW_1
*/&&static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )&&{&&&&VOID&&// Intentionally unreferenced parameter&&&&&&if ( keys & HAL_KEY_SW_6 )&&&&{&&& & uint8 initial_advertising_enable = FALSE;&&& & GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//关广播&&& && && & osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_KEY_UPDATE_ADV_EVT, 0 );//修改广播数据& && & &&&&}&&}&&
3)SBP_KEY_UPDATE_ADV_EVT事件中的处理
if ( events & SBP_KEY_UPDATE_ADV_EVT )& && &&&//按键更新广播事件&&{&&&&uint8 advertData_Update[] =&&&&{&&& & 0x07,& &&&//自定义短名的长度&&& & GAP_ADTYPE_LOCAL_NAME_SHORT,&&& & 0x47,& &&&//G&&& & 0x55,& &&&//U&&& & 0x41,& &&&//A&&& & 0x3A,& &&&//:&&& & 0x00,& &&&//给键值预留&&& & 0x00,& &&&//给按键次数预留&&& && && & 0x03,& &&&//UUID字段长度&&& & GAP_ADTYPE_16BIT_MORE,& && &// some of the UUID's, but not all&&& & LO_UINT16( SIMPLEPROFILE_SERV_UUID ),&&& & HI_UINT16( SIMPLEPROFILE_SERV_UUID ),&&&&};&&& & &&advertData_Update[6] = HAL_KEY_SW_6;& && &&&//把按键值放到广播数据中&&&&advertData_Update[7] = key_& && &&&//把按键值放到广播数据中&&& & &&if((key_count++)%3)//如果按键次数不是3的倍数,则广播我自己的数据&&&&{&&& & GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,& && && && && && && && && && && &TRUE,&&& && && && && && && && && && &sizeof(advertData_Update),&&& && && && && && && && && && &advertData_Update );& && &//更新广播数据& & &&}&&&&else//如果按键次数是5的倍数,则广播协议栈本来的数据&&&&{&&& & GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,& && && && && && && && && && && &TRUE,&&& && && && && && && && && && &sizeof(advertData),&&& && && && && && && && && && &advertData );& && &//更新广播数据& && && &&&}&&&&&&uint8 initial_advertising_enable = TRUE;&&&&GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//开广播&&& & &&return (events ^ SBP_KEY_UPDATE_ADV_EVT);&&}&&
注:GAP_UpdateAdvertisingData的第二个形参为TRUE时修改的是广播数据、为FALSE时修改的是扫描应答数据。这里只以广播数据为例,扫描应答数据的修改也是类似的。
六、实验结果1、上电广播这是协议栈默认的广播数据。
2、按键按1下
可以看到广播数据变了,并且第8个数据是当前的按键次数1。
3、按键按2下
第8个字节的按键次数由1变成了2。
4、按键按3次
按键次数为3的倍数,所以修改回协议栈默认的广播数据。
5、按键按4次
非3的倍数次按键,都会是我自己定义的数据。此时第8字节是4次按键。
13:25:41  
谢谢,太感谢啦,真的很好
13:26:24  
我还分享到我的QQ啦,真的很好的文章,谢谢楼主
13:36:57  
我还分享到我的QQ啦,真的很好的文章,谢谢楼主
很高兴& &&&ADC总结_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩10页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢博客访问: 519847
博文数量: 108
博客积分: 0
博客等级: 民兵
技术积分: 3545
注册时间:
认证徽章:
不能不写?
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
51822的adc 模块图如下所示:
51822ADC有8个通道。AIN0-AIN7.这几个通道对应的引脚是固定的。可以在 51822的产品说明书中找到。
通过CONFIG寄存器 选择哪一个通道作为ADC的输入。
如上图,ADC不仅可以测量8个通道的输入进过比例转换后的模拟电压(比如选择1/3,则实际adc转换的数据为外部输入电压的1/3),还可以测量 VDD/3 和VDD*2/3的电压值,也是通过CONFIG寄存器来设置。
CONFIG中的RES位用来控制adc的精度。
CONFIG中的REFSEL用来选择参考电压,同样参考电压也可以经过一定比列缩放。
由上所述,设置10bit精度adc, 测量外部输入电压的1/3,参考电压使用1.2 并且测量通道用AIN2则设置如下。
&&& NRF_ADC->CONFIG = (2 << 0)& //adc转换精度为10位
&&&&&&&&&&&&&&&&& | (2 << 2) //adc测量值为输入的1/3
&&&&&&&&&&&&&&&&& | (0 << 5) //选择内部1.2为参考电压
&&&&&&&&&&&&&&&&& | (4 << 8);//选择AIN2为adc的输入
51822的ADC的配置组合有很灵活。但是51822
ADC有两条限制规则
&&&&1,引脚上的输入电压经过缩放后不能大于2.4V,
&&&&2, GPIO上的输入电压不能超过VDD+0.3V.
&&&&所以具体的各种配置下所允许测量的 输入电压有一定限制,需要看手册确定。
ADC的工作方式可以是轮训或者中断方式。
51822 ADC本身只支持一次转换,所以每次转换完成后需要再测量时,都要再次设置启动转换。如果需要保持周期测量,则需要用一个定时器来周期启动adc。
INTEN:改寄存器用来设置 转换完成后是否触发中断。
BUSY: 该寄存机用来查看ADC转换是否已经完成。通常在轮训方式中使用。
ENABLE: 使能adc
RESULT:存储 adc 转换后的结果。
中断方式就是使能 INTEN寄存器中的转换完成触发中断。并开启MCU的adc中断,每次启动后等到中断到来,在中断中读取RESULT寄存器的值就好了。
这里为了方便,下面的例子直接用轮训方式,启动转换后原地轮训等待转换完成(通过BUSY寄存器判断)。
PS:针对电池电量检测这种应用,原地轮训等待转换完成基本不会影响 整体效率,因为电量检测这种应用本身测量周期比较长,通常都是 以 秒为单位, 同时51822的adc转换也比较快,10位精度的转换68us就可以完成 &8位精度转换20us就可以完成。
轮训方式的简单例子
Adc设置初始化函数如下:
void nrf_adc_init(void){
&&& NRF_ADC->CONFIG = (2 << 0)& //adc转换精度为10位
&&&&&&&&&&&&&&&&& | (2 << 2) //adc测量值为输入的1/3
&&&&&&&&&&&&&&&&& | (0 << 5) //选择内部1.2为参考电压
&&&&&&&&&&&&&&&&& | (4 << 8);//选择AIN2为adc的输入
&&& //使能adc END事件触发中断
//& NRF_ADC->INTENSET = 0x01;
&&& NRF_ADC->ENABLE = 0x01;&
void nrf_adc_start(){
&&& NRF_ADC->TASKS_START = 0X01;
在ble_uart的例子中加一个简单的轮训测量。直接在广播启动代码前面加一个死循环测量。
XXX:\Keil_v5\ARM\Pack\NordicSemiconductor\nRF_Examples\9.0.0\ble_peripheral\ble_app_uart
在这个例子里加就是为了利用一下工程中的printf函数。然后死循环轮训测量adc。同时电池服务我们在这个工程里面添加实现
下面实现一个周期发送电量值的&电池服务:
因为只是演示如何实现这个功能,所以例子编写的比较粗糙,实际中编写的时候需要根据自己的需求完善。
首先在 ble_nus结构体中添加& 记录电池服务特性 中相关的特征值和描述符句柄
添加 电量特征值uuid的定义,这里只是随便定义了一个。并没有使用标准的电池服务的uuid。
实现 battery 特征值的添加函数,这里电池服务实现是定时周期使用notify方式将电量发送给手机,所以通信方式是跟nus服务中的rx特征值一样的,所以直接拷贝ble_nus.c中的rx_char_add 函数做一下简单修改就可以了
static uint32_t
battery_char_add(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init)
&&& ble_gatts_char_md_t char_
&&& ble_gatts_attr_md_t cccd_
&&& ble_gatts_attr_t&&& attr_char_
&&& ble_uuid_t&&&&&&&&& ble_
&&& ble_gatts_attr_md_t attr_
&&& memset(&cccd_md, 0, sizeof(cccd_md));
&&& BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm);
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm);
&&& cccd_md.vloc = BLE_GATTS_VLOC_STACK;
&&& memset(&char_md, 0, sizeof(char_md));
&&& char_md.char_props.notify = 1;
&&& char_md.p_char_user_desc& = NULL;
&&& char_md.p_char_pf&&&&&&&& = NULL;
&&& char_md.p_user_desc_md&&& = NULL;
&&& char_md.p_cccd_md&&&&&&&& = &cccd_
&&& char_md.p_sccd_md&&&&&&&& = NULL;
ble_uuid.type = p_nus->uuid_
//替换uuid
&&& ble_uuid.uuid = BLE_UUID_NUS_RX_CHARACTERISTIC;
&&& memset(&attr_md, 0, sizeof(attr_md));
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);
&&& attr_md.vloc&&& = BLE_GATTS_VLOC_STACK;
&&& attr_md.rd_auth = 0;
&&& attr_md.wr_auth = 0;
&&& attr_md.vlen&&& = 1;
&& &memset(&attr_char_value, 0,
sizeof(attr_char_value));
&&& attr_char_value.p_uuid&&& = &ble_
&&& attr_char_value.p_attr_md = &attr_
&&& attr_char_value.init_len& = sizeof(uint8_t);
&&& attr_char_value.init_offs = 0;
&&& attr_char_value.max_len&& = BLE_NUS_MAX_RX_CHAR_LEN;
&& //替换存储 特性的结构体指针
&&& return
sd_ble_gatts_characteristic_add(p_nus->service_handle,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&attr_char_value,
&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&p_nus->rx_handles);
然后修改ble_nus.c中的
ble_nus_init(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init)& 函数 添加 电池特特性创建的
uint32_t ble_nus_init(ble_nus_t * p_nus,
const ble_nus_init_t * p_nus_init)
&& …………………………
&&& …………………………
&&& …………………………
&&& // Add the TX Characteristic.
&&& err_code = tx_char_add(p_nus, p_nus_init);
&&& if (err_code != NRF_SUCCESS)
&&&&&&& return err_
&& //添加电池特性创建服务的调用
&& err_code =
battery_char_add(p_nus, p_nus_init);
&&& if (err_code
!= NRF_SUCCESS)
&&&&&&& return
&&& return NRF_SUCCESS;
然后实现 电池电量的发送函数。直接拷贝ble_nus.c中的ble_nus_string_send函数并作如下修改。
uint32_t &battery_send(ble_nus_t
* p_nus, uint8_t
*battery_level,uint16_t length)
&&& ble_gatts_hvx_params_t hvx_
&&& if (p_nus == NULL)
&&&&&&& return NRF_ERROR_NULL;
&&& //去掉是否使能notify的标记判断,因为这里用的是电池通道,
&&& //本来也应该想rx一样做一个是否notify过的标志,例子里为了方便就
&&& //没做
&&& if (p_nus->conn_handle == BLE_CONN_HANDLE_INVALID)
&&&&&&& return NRF_ERROR_INVALID_STATE;
&&& if (length > BLE_NUS_MAX_DATA_LEN)
&&&&&&& return NRF_ERROR_INVALID_PARAM;
&&& memset(&hvx_params, 0,
sizeof(hvx_params));
& &&hvx_params.handle =
p_nus->battery_handles.value_
&& &hvx_params.p_data =
&&& hvx_params.p_len& = &
&&& hvx_params.type&& = BLE_GATT_HVX_NOTIFICATION;
&&& return
sd_ble_gatts_hvx(p_nus->conn_handle, &hvx_params);
之后再创建一个定时器来定时发送电量值
app_timer_create(&battery_timer,APP_TIMER_MODE_REPEATED,
battery_timer_handler);
注意 main.c中的宏要响应增加1 #define APP_TIMER_MAX_TIMERS&&&&&&&&&&& (3 + BSP_APP_TIMERS_NUMBER)&&&&&&&&&&&
定时到期处理函数
void battery_timer_handler(void *p_context){
&&& static uint8_t
battery_level[4];
&&& uint32_
&&& nrf_adc_start();
&&& while(NRF_ADC->BUSY&1);
&&& float value =
(NRF_ADC->RESULT)*1.0;
&&& value = value*1.2/1024.0;
&&& value *= 3;
//将电压值扩大100倍,好发送整数出去。
&&& temp = value * 100;
&&& battery_level[0]& = (temp>>24)&0
&&& battery_level[1]& = (temp>>16)&0
&&& battery_level[2]& = (temp>>8)&0&&&
&&& battery_level[3] &= (temp>>0)&0
&&& battery_send(&m_nus,
battery_level, 4);
并在连接上后就启动定时器。开始 1s 周期发送电量。
Ble_nus.c中修改
extern app_timer_id_t battery_
void ble_nus_on_ble_evt(ble_nus_t * p_nus, ble_evt_t * p_ble_evt)
&&& if ((p_nus == NULL) || (p_ble_evt
&&& switch
(p_ble_evt->header.evt_id)
&&&&&&& case
BLE_GAP_EVT_CONNECTED:
&&&&&&&&&&& on_connect(p_nus,
p_ble_evt);
&&&&&& && app_timer_start(battery_timer,& APP_TIMER_TICKS(1000, 0), NULL);
&&&&&&&&&&&
&&&&&&& case
BLE_GAP_EVT_DISCONNECTED:
&&&&&&&&&&& on_disconnect(p_nus,
p_ble_evt);
&&&&&&&&&&&
&&&&&&& case BLE_GATTS_EVT_WRITE:
&&&&&&&&&&& on_write(p_nus,
p_ble_evt);
&&&&&&&&&&&
&&&&&&& default:
&&&&&&&&&&& // No implementation
&&&&&&&&&&&
这里写的例子比较粗糙。正确的做法应该是,在手机使能电量发送特征值的notify后,从机才开始定时发送。不过这里这样做并不影响现象,因为虽然连接上后就开始周期发送电量,但是因为notify并未被使能,所以发送会失败,但是程序可以继续正常运作。
烧写程序,手机连接上后,找到电池的那个特征值,使能Notify就能收到周期性的电量报告了。
Main函数如下:
int main(void)
&&& uint32_t err_
&&& bool erase_
&&& uint8_t& start_string[] = START_STRING;
&&& // Initialize.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS,
APP_TIMER_OP_QUEUE_SIZE, false);
&&& uart_init();
&&& app_timer_create(&battery_timer,APP_TIMER_MODE_REPEATED,
battery_timer_handler);
buttons_leds_init(&erase_bonds);
&&& ble_stack_init();
&&& gap_params_init();
&&& services_init();
&&& advertising_init();
&&& conn_params_init();
&&& printf("start\r\n");
&& nrf_adc_init();
&&& err_code =
ble_advertising_start(BLE_ADV_MODE_FAST);
&&& APP_ERROR_CHECK(err_code);
&&& // Enter main loop.
&&& for (;;)
&&&&&&& power_manage();
阅读(3671) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。当手机和设备连接上后,设备端可以通过获取RSSI来 在一定程度上判断手机离设备的相对距离的远近。
获取函数很简单直接调用sd_ble_gap_rssi_get&接口函数就行了,传入连接句柄和buff就能获取到 最近一次连接事件中的 接收信号强度。
调用该函数之前需要先调用sd_ble_gap_rssi_start&&函数,该函数有三个参数,第一个为连接句柄,第二个为 改变阈&#20540;, 第三个为忽略次数。
该函数有两种用法, 一种就是 将阈&#20540;参数设置为,
忽略次数参数设置为0。那么每次直接调用sd_ble_gap_rssi_get&函数获取最近一次连接事件中的RSSI&#20540;就行了。
如下图所示
另一种使用方式是, 设置第二个参数为一个有效的域&#20540;, 当rssi与上一次收到的rssi差&#20540;大于等于这个阈&#20540;时就会&事件,同时也可设置第三个阈&#20540;来防抖动,即忽略次数,比如设置
阈&#20540;为5,忽略次数为3。如果前一次收到的rssi&为1&,那么只有rssi差&#20540;大于等于5超过 三次,第四次才会产生&事件
下面实际用代码来实现两种方式。
第一种不使用阈&#20540;和事件的简单方式: 即直接启动,然后调用函数主动获取。
我们设置一个定时器,在设备连接上后,启动定时器开始周期获取RSSI.
在main&函数中 创建一个定时器
&&&&&& app_timer_create(&rssi_timer, APP_TIMER_MODE_REPEATED, rssi_timeout_handler);
定时处理函数很简单,就是 获取RSSI
void rssi_timeout_handler(void *p_context){
&&&&&& int8_
&&&&&& sd_ble_gap_rssi_get(m_conn_handle, &rssi);
&&&&&& printf(&rssi: %d\r\n&,rssi);
然后在连接事件产生的地方添加&sd_ble_gap_rssi_start&并且启动 上面创建的定时器。
如下图所示
运行程序,当手机连接上设备后,就能看到串口周期打印RSSI&#20540;了,手机变动距离可以看到RSSI&#20540;的变化。
第二种方式: 使用阈&#20540;和事件方式
在on_ble_evt&事件处理函数中,添加当收到连接事件后rssi&测量启动代码,和BLE_GAP_EVT_RSSI_CHANGED事件处理代码
代码中我们定义rssi变化&#20540;大于5时才产生BLE_GAP_EVT_RSSI_CHANGED事件,然后在事件处理中打印rssi&#20540;
如下图所示:
运行程序查看输出打印可以发现&RSSI的差&#20540;都是大于等于5的
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(3)(2)(21)(7)(79)(1)(3)
访问:21059次
排名:千里之外
转载:110篇& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &CC2541之电池电量查询并广播 & & &
& & & & & & & & &&
& & &以SimpleBLEPeripheral工程为例, 介绍如何读取电量并且广播。
二、实验平台
协议栈版本:
BLE-CC254x-1.4.0
编译软件: IAR 8.20.2
硬件平台: CC2541 &#43; USB-RS232 & & &USB dongle
手机平台:
三、实现步骤
1.保证项目中有hal_adc.c和hal_adc.h
2.添加Profile如下图所示
我的文件路径在:C:\Texas Instruments\BLE-CC254x-1.4.0\Projects\ble\Profiles\Batt
(如果找不到建议下载一个“光速搜索”,这个软件用起来很好用)
3.添加两文件的路径(因为我的改了名字,你们的不必和我的一致,和你们的名字相同就行了)
4.打开ADC采样的宏
5.添加头文件(
simpleBLEPeripheral.c)
#include &battservice.h&
6.修改代码给电源电量预留的位置(&simpleBLEPeripheral.c)
static uint8 advertData[] =
& GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
& 0x20, //给MAC地址预留位置 & & 2
& 0x20, // & & & & & & & & & & &7 &
& GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
& 0x20,//给电池电量预留的位置 & 10
7.添加相应的变量&(simpleBLEPeripheral.c)
8、添加相应的代码(simpleBLEPeripheral.c)
& &//读取电池电量
& & Batt_GetParameter(BATT_PARAM_LEVEL,battLevel);
& & osal_memcpy (advertData &#43; 10, battLevel,1);
& & //更新广播数据
& & GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,TRUE,sizeof(advertData),advertData );
& & 读取电池电量这里需要注意我在simpleBLEPeripheral.c中调用battservice.c中调用下面这个函数
& & 不能用,我也添加了相应的声明在“.h”文件中 并且把static去掉了还是不能再其他的.c文件中调用。只能在
& & battservice.c中调用(这个希望大神们指导)
在下面这个函数中调用battMeasure函数读取相应的电池电量。(battservice.c)
&bStatus_t Batt_GetParameter( uint8 param, void *value )
& bStatus_t ret = SUCCESS;
& switch ( param )
& & case BATT_PARAM_LEVEL:
& & & //wodejiqing
& & & battLevel = battMeasure();
& & & *((uint8*)value) = battL
9、在&simpleBLEperipheral.h中添加一个新的事件
10、在&simpleBLEperipheral.c中下面位置启动这个事件
11.添加相应的处理函数(我的是广播30秒后不再广播)
&//周期性广播处理事件
& & if ( events & SBP_ADV_PERIODIC_PROCESS_EVT )
& & &static uint8 k = 0;
& & &osal_memcpy (advertData &#43; 2, ownAddress,6);
& & &osal_memcpy (advertData &#43; 10, battLevel,1);
& & // GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
& & &GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,TRUE,sizeof(advertData),advertData ); //更新广播数据
& & & k &#43;= 2;
& & & if(k &= 30 )
& & & &osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_ADV_PERIODIC_PROCESS_EVT, adv_per_time );
& & &}else{
& & & & & & uint8 initial_advertising_enable = FALSE;
& & & & & & GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
& & & & & }
& & &return (events ^ SBP_ADV_PERIODIC_PROCESS_EVT);
然后就可以了
下面是运行结果因为用的是usb供电所以电量一直未100、我也用过电子供电,结果很理想。
我是一个无线通信爱好者
希望这篇博客可以帮到更多的人
& & & 本人新手,写博客想记录成长历程还有请大神们指正不足之处,还有许多不足的地方,希望各位大神不吝赐教。谢谢
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:804次
排名:千里之外

我要回帖

更多关于 ble 广播模式 的文章

 

随机推荐