nrf5182-主机-串口代码讲解_第1页
nrf5182-主机-串口代码讲解_第2页
nrf5182-主机-串口代码讲解_第3页
nrf5182-主机-串口代码讲解_第4页
nrf5182-主机-串口代码讲解_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

nrf5182 主机主机 串口代码讲解 跟官方的串口代码配套使用串口代码讲解 跟官方的串口代码配套使用 工程文件 nrf51822 Board nrf6310 s120 experimental ble app uart c arm 配套的 uart 的串口从机是 nrf51822 Board pca10001 s110 experimental ble app uart 1 首先添加 16 位的 uuid 号 重新宏定义如下 点击点击 此处此处 折叠或打开折叠或打开 1 define BLE UUID NUS SERVICE 0 x0001 The UUID of the Nordic UART Service 2 define BLE UUID NUS TX C CHARACTERISTIC 0 x0003 主机的 TX 特性 对应于从机 的 RX 特性 3 define BLE UUID NUS RX C CHARACTERISTIC 0 x0002 主机的 RX 特性 4 5 define BLE NUS MAX DATA LEN GATT MTU SIZE DEFAULT 3 最大 20 字节 Maximum length of data inbytes that can be transmitted by the Nordic UART service module to the peer 6 7 define BLE NUS MAX RX CHAR LEN BLE NUS MAX DATA LEN 等价于接收长度 Maximum length of the RX Characteristic in bytes 8 define BLE NUS MAX TX CHAR LEN BLE NUS MAX DATA LEN INTENSET UART INTENSET RXDRDY Enabled evt type 8 9 case BLE NUS C EVT DISCOVERY COMPLETE 10 APPL LOG APP 发现了从机 进行绑定 及允许服务器发送通知 r n 11 发现了串口的从机 进行绑定 12 Initiate bonding 13 err code dm security setup req 14 APP ERROR CHECK err code 15 使能从机发送通知事件 16 err code ble nus c tx notif enable p nus c 17 APP ERROR CHECK err code 18 19 break 20 21 case BLE NUS C EVT TX NOTIFICATION 22 23 char hr as string LCD LLEN 24 接收到了通知事件 直接打印下来 25 APPL LOG APP receive s r n p nus c evt params tx tx value 26 break 27 28 default 29 break 30 31 ble nus c init 函数主要是添加了一个自定义的 uuid 基数 并把服务的 16 位 uuid 号的回调函数注册 到了发现模块 当系统运行扫描后 当发现模块发现这个 uuid 后 会调用这个回调函数 1 2 brief s120 串口初始化 3 4 5 uint32 t ble nus c init ble nus c t p ble nus c ble nus c init t p ble nus c ini t 6 7 uint32 t err code 8 if p ble nus c NULL p ble nus c init NULL 9 10 return NRF ERROR NULL 11 12 增加一个自定义的蓝牙 uuid 基数 13 ble uuid128 t nus base uuid 0 x9E 0 xCA 0 xDC 0 x24 0 x0E 0 xE5 0 xA9 0 xE0 14 0 x93 0 xF3 0 xA3 0 xB5 0 x00 0 x00 0 x40 0 x6E 15 16 mp ble nus c p ble nus c 17 18 err code sd ble uuid vs add 19 if err code NRF SUCCESS 20 21 return err code 22 23 设置服务的 16 位 uuid 配合前面加的蓝牙 uuid 基数 组成一组完整 128 位的 uuid 号 24 mp ble nus c nus uuid uuid BLE UUID NUS SERVICE 25 26 27 mp ble nus c evt handler p ble nus c init evt handler 28 设置服务连接句柄为 无效 29 mp ble nus c conn handle BLE CONN HANDLE INVALID 30 设置特性的句柄为无效 31 mp ble nus c nus rx handle BLE GATT HANDLE INVALID 32 mp ble nus c nus tx handle BLE GATT HANDLE INVALID 33 设置接收的描述符句柄为 无效 34 mp ble nus c nus rx cccd handle BLE GATT HANDLE INVALID 35 mp ble nus c nus tx cccd handle BLE GATT HANDLE INVALID 36 注册服务的 uuid 及其回调函数 37 当发现模块发送有该 uuid 就会调用 db discover evt handler 38 return ble db discovery register 40 1 当这个服务 的 uuid 号被发现 那么这个函数就被调用 2 static void db discover evt handler ble db discovery evt t p evt 3 检查 uuid 号和类型是不是一致 4 if p evt evt type BLE DB DISCOVERY COMPLETE 5 12 mp ble nus c conn handle p evt conn handle 13 14 Find the CCCD Handle of the Heart Rate Measurement characteristic 15 uint8 t i 16 17 for i 0 i params discovered db char count i 18 19 检查特性的 uuid 号是不是一致 20 if p evt params discovered db charateristics i characteristic uuid uuid 21 22 BLE UUID NUS RX C CHARACTERISTIC 23 24 25 characteristic Store CCCD handle and break 26 27 rx 的描述符句柄 28 mp ble nus c nus rx cccd handle 29 p evt params discovered db charateristics i cccd handle 30 rx 的句柄 31 mp ble nus c nus rx handle 32 p evt params discovered db charateristics i characteristic handle value 33 LOG NUS C RX 特性被发现 nus rx cccd handle d nus rx handle d r n mp ble nus c nus rx cccd handle mp ble nus c nus rx handle 34 35 else if p evt params discovered db charateristics i characteristic uuid uuid 36 37 BLE UUID NUS TX C CHARACTERISTIC 38 39 40 Found Heart Rate characteristic Store CCCD handle and break 41 mp ble nus c nus tx cccd handle 42 p evt params discovered db charateristics i cccd handle 43 mp ble nus c nus tx handle 44 p evt params discovered db charateristics i characteristic handle value 45 LOG NUS C TX 特性被发现 nus tx cccd handle d nus tx handle d r n mp ble nus c nus tx cccd handle mp ble nus c nus tx handle 46 else 47 LOG NUS C 有其他的特性 r n 48 49 50 51 52 53 ble nus c evt t evt 54 55 evt evt type BLE NUS C EVT DISCOVERY COMPLETE 56 运行 main 文件注册的回调函数 nus c evt handler 57 mp ble nus c evt handler mp ble nus c 58 59 上面就是初始化做的所有事 接下来分析事件 每发生一个事件都会调用其回 调函数 看一下蓝牙协议栈初始化 主要有ble evt dispatch sys evt dispatch 两个回调函数 主要讲解 ble evt dispatch 1 static void ble stack init void 2 3 uint32 t err code 4 5 Initialize the SoftDevice handler module 6 SOFTDEVICE HANDLER INIT NRF CLOCK LFCLKSRC XTAL 20 PPM false 7 8 Register with the SoftDevice handler module for BLE events 9 err code softdevice ble evt handler set ble evt dispatch 10 APP ERROR CHECK err code 11 12 Register with the SoftDevice handler module for System events 13 err code softdevice sys evt handler set sys evt dispatch 14 APP ERROR CHECK err code 15 ble evt dispatch 把事件分派给各个模块处理 自己主要需要编写的 ble nus c on ble evt 及 on ble evt 1 static void ble evt dispatch ble evt t p ble evt 2 3 4 app trace log evt id x r n p ble evt header evt id 5 dm ble evt handler p ble evt 管理模块的处理 6 ble db discovery on ble evt 发现模块的处 理 7 ble nus c on ble evt nus 的处理 8 on ble evt p ble evt main 的处理 广播包处理 进行连接 9 看一下 main 函数中的on ble evt 1 brief Function for handling the Application s BLE Stack events 这里主要处 理的广播包 2 3 param in p ble evt Bluetooth stack event 4 5 static void on ble evt ble evt t p ble evt 6 7 uint32 t err code 8 ble uuid t peer uuid 9 const ble gap evt t p gap evt 10 app trace log on ble evt r n 11 switch p ble evt header evt id 12 13 发现了一个广播包 14 case BLE GAP EVT ADV REPORT 15 16 data t adv data 17 data t type data 18 19 Initialize advertisement report for parsing 20 首先是要从广播包解析出数据 21 adv data p data uint8 t p gap evt params adv report data 22 adv data data len p gap evt params adv report dlen 23 获得完整的 128bit uuid 号 24 err code adv report parse BLE GAP AD TYPE 128BIT SERVICE UUID COMPLETE 25 27 28 Verify if short or complete name matches target 29 if err code NRF SUCCESS 30 对 uuid 进行换算 128bit 换算成一个 16bit 及其类型 31 err code sd ble uuid decode type data data len type data p data 32 if err code NRF SUCCESS 33 if peer uuid uuid m ble nus c nus uuid uuid 36 if err code NRF SUCCESS 37 APPL LOG APPL Scan stop failed reason d r n err code 38 39 nrf gpio pin clear SCAN LED PIN NO 40 err code sd ble gap connect 44 45 if err code NRF SUCCESS 46 47 APPL LOG APPL Connection Request Failed reason d r n err code 48 else 49 APPL LOG 连接建立 r n 50 51 break 52 53 else 54 APPL LOG 匹配出错 r n 55 56 57 58 59 break 60 61 以下省略 直接拷贝官方的处理方式 看一下 nus 模块的处理 1 void ble nus c on ble evt ble nus c t p ble nus c const ble evt t p ble evt 2 ble uuid t server uuid 3 uint32 t err code 4 5 if p ble nus c NULL p ble evt NULL 6 return 7 8 switch p ble evt header evt id 9 10 case BLE GAP EVT CONNECTED 11 连接完成 获取连接句柄 12 p ble nus c conn handle p ble evt evt gap evt conn handle 13 LOG NUS C BLE GAP EVT CONNECTED conn handle d r n p ble nus c conn handle 14 break 15 16 case BLE GATTC EVT HVX 17 通知事件 18 LOG NUS C BLE GATTC EVT HVX r n 19 on hvx p ble nus c p ble evt 20 break 21 22 case BLE GATTC EVT WRITE RSP 23 LOG NUS C BLE GATTC EVT WRITE RSP r n 24 客户端发送写请求给服务器 服务器会回一个应答信号给客户端 这时客户端可以发送下一条写请求给服务器端 25 属性协议规定 写请求需要在前一条请求接收到应答后才能继续 26 添加的原因 猜测 发送写请求是通过一个队列的 如果发送失 败 那么就会有一个未发送的在队列里 27 如果这时在发送一个写请求 那么发送将会是前一条写请求 而 后收到应答后会继续发送写请求 28 29 on write rsp p ble nus c p ble evt 30 break 31 32 default 33 break 34 35 通知事件处理 1 通知事件的处理方式 2 static void on hvx ble nus c t p ble nus c const ble evt t p ble evt 3 4 Check if this is a heart rate notification 5 检查是不是 tx 的句柄 6 if p ble evt evt gattc evt params hvx handle p ble nus c nus tx handle 7 8 ble nus c evt t ble nus c evt 9 uint8 t index 0 10 设置成 BLE NUS C EVT TX NOTIFICATION 11 ble nus c evt evt type BLE NUS C EVT TX NOTIFICATION 12 strncpy ble nus c evt params tx tx value p ble evt evt gattc evt params hvx data p ble evt evt gattc evt params hvx len 13 ble nus c evt params tx tx len p ble evt evt gattc evt params hvx len 14 调用 main 函数注册的回调函数 nus c evt handler 15 p ble nus c evt handler p ble nus c 16 17 对于写应答 主要是继续发送下一条请求 如果有的话 接下来讲解一下客户端怎么发送数据到服务器 串口中断程序 点击点击 此处此处 折叠或打开折叠或打开 1 void UART0 IRQHandler void 2 3 static uint8 t data array BLE NUS MAX DATA LEN 4 static uint8 t index 0 5 uint32 t err code 6 7 snippet Handling the data received over UART 8 9 data array index simple uart get 10 index 11 12 if data array index 1 n index BLE NUS MAX DATA LEN 1 13 14 发送数据到服务器 15 tx send 16 index 0 17 18 19 snippet Handling the data received over UART 20 点击点击 此处此处 折叠或打开折叠或打开 1 void tx send ble nus c t p ble nus c char str unsigned char len 2 3 tx message t p msg 4 if len WRITE MESSAGE LENGTH 5 return 6 7 8 发送队列 9 p msg 10 m tx insert index 11 strncpy p msg req write req gattc value str len 12 属性句柄

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论