版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
青 技术 蓝牙API头文件设 蓝牙API主函数设计 开通API应用服 8.3.6处理串口接收事 验 青风带你玩蓝牙nRF51822系 青风电子社区作者 青:硬件平台:青云QY-nRF51822原理分析与讲解:BLE串口应用示例学习必须在你之前认真解读了前面3讲详解里的内容为基础后 对比两个工程数,蓝牙串口需要单独写一个API应用文件,开通串口蓝牙服务,也就是工程中的ble_nus.c文件。下面的章节重点就是来教大家如何编写这个函数文主函数的建立Nrf51822蓝牙工程的主函数有着一定的通用性,初始化过程类似,需要修改的intint{boolerase_bonds;uint8_tstart_string[]=APP_TIMER_INIT(APP_TIMER_PRESCALER,APP_TIMER_OP_QUEUE_SIZE,err_code=ble_advertising_start(BLE_ADV_MODE_FAST);//Entermainloop.for(;;){}}外设部分初始化staticvoidstaticvoid{/**初始化串口参数simple_uart_config(RTS_PIN_NUMBER,TX_PIN_NUMBER,CTS_PIN_NUMBER,RX_PIN_NUMBER,HWFC);NRF_UART0->INTENSET=UART_INTENSET_RXDRDY_Enabled<<NVIC_SetPriority(UART0_IRQn,/*配置串口中断}协议栈相关初始化staticvoidstaticvoid{ memset(&nus_init,0,nus_init.data_handlernus_data_handler;err_codeble_nus_init(&m_nus,&nus_init);}口传输处理句柄,作为回调函数。这个函数用来处理的串口UART发送数据和从接收voidvoidnus_data_handler(ble_nus_t*p_nus,uint8_t*p_data,uint16_t{for(inti=0;i<length;{{}}意命名。那么有朋友会问,函数的形参如何设置?需要怎么编写?这就是API需蓝牙APIAPI函数库文件头文件设计:我们在样例基础上添加的驱动ble_nush头文件实现了各种数据结构、应用需要实现的事件句柄和以下3个API函数,下面来一一介绍:uint32_tuint32_tble_nus_init(ble_nus_t*p_nus,constble_nus_init_t*p_nus_init);voidble_nus_on_ble_evt(ble_nus_t*p_nus,ble_evt_t*p_ble_evt);ble_evt_t为常见的事件类型,模块的具体事件的报告,这个结构体给出的BLE.H头文件已经给出,这个可以不用再单独定义。这两个函数的定义和前面一章《蓝牙按键详解》里的API头文件设置高度一致。uint32_tuint32_tble_nus_send_string(ble_nus_t*p_nus,uint8_t*string,uint16_t数据结构体设计同时在ble_nus.h头文件用到的数据结构还没有定义:ble_nus_tble_nus_init_t于LED服务,此服务不依赖于任何启动或停止,所以只使用一个函数作为回调函数,当LED特性被写入时被调用。这里还是和第二章内容一致,typedeftypedef{}uint16_tlength);lUUIDll串口发送的句柄l串口接收的句柄l特性的句柄ll服务结构体定义如下typedeftypedefstruct{ble_gatts_char_handles_ttx_handles;ble_gatts_char_handles_trx_handles;ble_gatts_char_handles_ttx_handles;ble_gatts_char_handles_trx_handles; ble_nus_data_handler_tdata_handler;}重点就是在ble_nus_t结构体中添加tx_handles和rx_handles特征值操作句柄,ble_gatts_char_handles_t类型,如下所示:typedeftypedef{}/**<处理的特征值不存在.第三个参数:/**<客户的特征描述符配置(CCCD)ble_gatt_handle_invalid如果不存在第四个参数:/**<服务器的特征描述符配置(SCCD)ble_gatt_handle_invalid如果不存在所有通过GATT服务传输的数据必须成一系列的特性,可以把特性中的这些数据看成是一个个起来的数据,每个特性就是一个自我包容而独立的数据点。例如,如以BLEuart应用为例,设备(带有串口的BLE)作为服务器,集中器作为客户提供特性的信息,它提供一个人类可识别的特性描述的实例。蓝牙API确定在API开通API配置实现上面几个功能,用户的应用功能就可以通过蓝牙BLE开通API应用服务在主函数中,APIservices_init()这里需要进staticvoidstaticvoid{ memset(&nus_init,0,nus_init.data_handler=}}err_code=ble_nus_init(&m_nus,voidvoidnus_data_handler(ble_nus_t*p_nus,uint8_t*p_data,uint16_t{for(inti=0;i<length;{}}那么这个开通服务函数ble_nus_init(&m_nus,&nus_init)主要要实现什么功能?在API函数文件内实现本函数。下面来详细探讨一下,首先列出函数代码:uint32_tble_nus_init(ble_nus_t*p_nus,constble_nus_init_tuint32_tble_nus_init(ble_nus_t*p_nus,constble_nus_init_t{ 0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x00,0x00,0x40,0x6E};if((p_nus==NULL)||(p_nus_init=={return}p_nus- = p_nus->is_notification_enabled=false;//添加UUIDerr_code=sd_ble_uuid_vs_add(&nus_base_uuid,&p_nus->uuid_type);if(err_code!=NRF_SUCCESS){return}ble_uuid.type=p_nus->uuid_type;ble_uuid.uuid=BLE_UUID_NUS_SERVICE;//添加GATTerr_code=&p_nus-if(err_code!={return}//添加RXerr_code=rx_char_add(p_nus,p_nus_init);if(err_code!=NRF_SUCCESS){}}//添加TXerr_code=tx_char_add(p_nus,p_nus_init);if(err_code!=NRF_SUCCESS){return}return}returnUUID设置方法蓝牙技术16位UUID所有的蓝牙技术定义UUID共用了一个基本的为了进一步简化基本UUID,每一个蓝牙技术定义的属性有一个唯一的16位16位UUID,因此它完整的128UUID为:蓝牙技术所用的基本UUID不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用另外完整的128位UUID。供应商特定的上。这种采用为所有的定制属性定义一个共用的基本UUID的方式使得应用变为更加使用nRFgoStudio非常容易产生一个新的基本例如,在例如,在BLE0x6E400000-B5A3-F393-E0A9-E50E24DCCA9E作为基本UUID蓝牙规范没有任何规则或是建议如何对加入基本UUID的16位UUID进行分配,例如,在例如,在BLE串口示例中,0x0001UUID,0x0002位UUID#define#define/**<TheUUIDoftheNordicUARTService.#define/**<TheUUIDoftheTXCharacteristic.#define服务使用这个基本UUID。在ble_nus_init()中只添加一次: nus_base_uuid={0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x00,0x00,0x40,ble_uuid128_tbase_uuid=err_code=sd_ble_uuid_vs_add(&base_uuid,&p_lbs->uuid_type);if(err_code!=NRF_SUCCESS){return}当为服务设置UUID时,使用这个UUIDble_nus_init()中添加服务GATT句柄,关于GATT原理面的章节最前面详细说明了:ble_uuid.type=p_lbs->uuid_type;ble_uuid.uuidble_uuid.type=p_lbs->uuid_type;ble_uuid.uuid=LBS_UUID_SERVICE;err_code=if(err_code!={return}串口接收和发送服务添加lllll指示:服务器发给指示给客户端,需要客户端发一个确认给服务器在//AddRX//AddRXerr_code=rx_char_add(p_nus,p_nus_init);if(err_code!=NRF_SUCCESS){return}}//AddTXerr_code=tx_char_add(p_nus,p_nus_init);if(err_code!=NRF_SUCCESS){return}蓝牙串口服务特性的配置析代码来了解如何编写特征值配置函数,首先看RX的代码如下所示:{/**@snippet[AddingproprietarycharacteristictoS110SoftDevice 特征值*/ble_gatts_char_md_tble_gatts_attr_md_tble_gatts_attr_md_tmemset(&cccd_md,0,cccd_md.vloc=memset(&char_md,0,///GATT特征值参数组char_md.char_props.notify=1;char_md.p_char_user_desc=NULL; =NULL; =NULL; = =p_nus- =memset(&attr_md,0,//属性参数组 = = = =memset(&attr_char_value,0,//GATT属性参数组 attr_char_value.p_attr_md=&attr_md;attr_char_value.init_len=sizeof(uint8_t);attr_char_value.init_offs=0; returnsd_ble_gatts_characteristic_add(p_nus-}有一个标志设置了CCCD的安全模式,它在ble_gap_conn_sec_mode_t结构体中,这个结构体使用在头文件ble_gap.h中定义的宏CCCD设置成对任何连接和加密都是可读可写的模式。其他任何的用于S110协议栈的特征值写入服务应用中:///GATT特征值参数组//属性参数组//GATT属性参数组所有通过GATT服务传输的数据必须成一系列的特性,可以把特性中的这些数据中的值的每一个字节的意义的关键信息。在一个GATT表中可能有许多属性,这些属特别注意这里要设置的内容://GATT//GATT属性参数组=attr_char_value.p_attr_md===attr_char_value.init_len=attr_char_value.init_offs=特性可以通过sd_ble_gatts_characteristic_add()4个参局变量,它包含了特性可能用到的性质(读,写,通知等)3个参数是值属性的sd_ble_gatts_characteristic_addsd_ble_gatts_characteristic_add(p_nus-串口TX的设置类似,这里就不再展开。代码请看参考代码。处理协议栈事件作为APIble_lbs_on_ble_evt用来处理协议栈事件,可以使用简单的switch-case语句通过返回事件头部的id号来区分不同的事件,voidvoidble_lbs_on_ble_evt(ble_lbs_t*p_lbs,ble_evt_t*{switch(p_ble_evt-{case}}}casecase处理串口特征staticstaticvoidon_write(ble_nus_t*p_nus,ble_evt_t*{ble_gatts_evt_write_t*p_evt_write=if(p_evt_write->len==){{{p_nus->is_notification_enabled=}{p_nus->is_notification_enabled=}}elseif(p_nus->data_handler!=){}{//DoNothing.Thiseventisnotrelevanttothis}}8.3.6处理串口接收事你已经添加了一个回调API函数让服务知道串口接收数据,但还没有全部实现,因协议栈SoftDeviceAPI函数sd_ble_gatts_hvx来完成这个事情,它需要连接句程。在结构体ble_gatts_hvx_params_t中,你需要设置为通知模式还是指示模式,uint32_tuint32_tble_nus_send_string(ble_nus_t*p_nus,uint8_t*string,uint16_tlength){ble_gatts_hvx_params_tif(p_nus=={return}if((p_nus->conn_handle==BLE_CONN_HANDLE_INVALID)||{return}if(length>{return}memset(&hvx_params,0,sizeof(hvx_params));hvx_params.p_data=string; = =}}returnsd_ble_gatts_hvx(p_nus->conn_handle,voidvoid{staticuint8_tindex=0;uint32_tdata_array[index]=simple_uart_get();if((data_arr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋认购协议书效力
- 展会白金赞助合同
- 合作开饭馆协议书格式
- 子女抚养协议书范文经典版
- 2024个人股权融资合作协议书
- 个人木材买卖合同范本
- 广告网络推广合同范例
- 常州全日制工作合同
- 房地产面积鉴定协议
- 成都市商品代销合同模板
- 教育局学校食品安全事故应急预案
- 义务教育信息科技课程标准(2022年版)考试题库及答案
- 2024年国家开放大学(电大)-混凝土结构设计(A)考试近5年真题集锦(频考类试题)带答案
- 2024-2025学年人教版八年级物理上学期期中模拟卷
- 新员工三级安全教育考试试题参考答案
- 统编版(2024)语文七年级上册 第10课 往事依依 公开课一等奖创新教案
- 危大工程清单及安全管理措施(样表)-纯图版
- 2024中国东方航空技术限公司全球校园招聘高频500题难、易错点模拟试题附带答案详解
- 2025届江苏省苏州市梁丰八年级数学第一学期期末学业质量监测试题含解析
- 2024-2030年中国氦液化系统市场深度调查与未来发展前景预测研究报告
- 2024年全国统考“营养师或营养指导员”相关知识考前试题库与参考答案
评论
0/150
提交评论