去年Noridc出了集成蓝牙4.0并能开口说话24L01通信芯片,这部电影可以非常小包装。和低功耗。非常适合于可穿戴设备,然后挖了一个免费的手在不久的将来AK II,又没了一个Becon的板子。先玩了一些主要的外设,如今開始玩了BLE的相关开发。

在官方的SDK文件夹下。我们能够找到Nordic\nrf51822\Board\pca10001\ble\experimental\ble_app_uart这个project文件,另外SDK文档中也有简介BLE UART数据转发的应用。

该应用包含一个服务,即 Nordic UART Service (UUID: 0x0001). The
UUID of the Nordic UART Service is 6E400001-B5A3-F393-E0A9-E50E24DCCA9E.

该服务包含两个特征。一个用于接收,还有一个用于发送:

TX Characteristic (UUID: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E):

When the peer has enabled notification for the Tx Characteristic, the application can send data to the peer as notifications. The application will
transmit all data received over UART as notifications.

RX Characteristic (UUID: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E):

Peer can start sending data to the device by writing to the Rx Characteristic of the service. ATT Write Request or ATT Write Command can be used.
The data received is sent on the UART interface.

简介下重要的代码:

添加专有服务(proprietary service)和特征(characteristic)

专有服务和特征的初始化操作室在 ble_nus.c,Nordic UART Service 添加到S110 SoftDevice 的步骤例如以下:

// Add custom base UUID.
err_code = sd_ble_uuid_vs_add(&nus_base_uuid, &p_nus->uuid_type);
if (err_code !=NRF_SUCCESS)
{
return err_code;
}
ble_uuid.type = p_nus->uuid_type;
ble_uuid.uuid = BLE_UUID_NUS_SERVICE;
// Add service.
&ble_uuid,
&p_nus->service_handle);
RX 特征添加到SoftDevice 的步骤例如以下,须要注意的是,特征的read和write权限和它的CCCD被设置为open,这意味着对特征没有安全方面的限制,同一时候也要注意UUID的类型
(ble_uuid.type)的值是通过调用sd_ble_uuid_vs_add()获取的,TX特征也是用相同的方式添加:

ble_gatts_attr_t
attr_char_value;
ble_uuid_t
ble_uuid;
memset(&cccd_md, 0,
sizeof(cccd_md));
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_md;
char_md.p_sccd_md
= NULL;
ble_uuid.type
= p_nus->uuid_type;
ble_uuid.uuid
= BLE_UUID_NUS_RX_CHARACTERISTIC;
memset(&attr_md, 0,
sizeof(attr_md));
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_uuid;
attr_char_value.p_attr_md
= &attr_md;
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;
returnsd_ble_gatts_characteristic_add(p_nus->service_handle,
&char_md,
&attr_char_value,
&p_nus->rx_handles);

UART初始化

全部跟初始化相关,通过BLE和UART数据接收和发送都是在main.c中实现的。
UART初始化操作例如以下,SDK中提供了UART的驱动的相关代码。能够运行UART配置。须要注意的是simple_uart_config函数的最后一个參数HWFC表示硬件流控使能。也就是说RTS和CTS被使用,接下来,使能了UART中断。

simple_uart_config(RTS_PIN_NUMBER,
TX_PIN_NUMBER, CTS_PIN_NUMBER, RX_PIN_NUMBER, HWFC);
NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Enabled << UART_INTENSET_RXDRDY_Pos;
NVIC_SetPriority(UART0_IRQn,
APP_IRQ_PRIORITY_LOW);
NVIC_EnableIRQ(UART0_IRQn);

处理通过BLE接收到的数据

在services_init()函数中初始化service,应用程序通过nus_data_handler函数用于处理通过BLE接收到的数据,这个时候Nordic
UART Service会指示已经存在有效的来自于配对好的设备的数据,这些数据会转发到UART,相关代码例如以下:

void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length)
{
for (int i = 0; i < length; i++)
{
simple_uart_put(p_data[i]);
}
}

处理通过UART接收到的数据

来自UART的数据在转发到BLE配对的设备之前,会先通过某些检查,以下的代码是在UART中断函数,通过UART接收到的数据之后都会调用该中断。这些接收到的字符首先会缓存到一个数组中,假设接收到一个'new line'(回车符)或者超过了NUS_MAX_DATA_LENGTH的长度,都将调用ble_nus_send_string 通过BLE发送出去。

注意:默认情况下NUS_MAX_DATA_LENGTH被设置为最大的值,这也是notification包最大的长度,比如:BLE_ATT_MTU - 3, 不能再变更长。

data_array[index] = simple_uart_get();
index++;
if ((data_array[index - 1] =='\n') || (index >= (BLE_NUS_MAX_DATA_LEN - 1)))
{
err_code = ble_nus_send_string(&m_nus, data_array, index + 1);
if (err_code !=NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
index = 0;
}

按键和LED灯分配:

LED0:Advertising。设备的名称能够被配对的设备显示,名称为'Nordic_UART',在未连接之前会一直闪烁。

LED1:Connected。连接后LED0灭,LED1亮

Button 0 :在系统off模式的时候,按下该按键会唤醒系统。開始Advertising

測试的硬件环境:

红米1S电信版,AK II。Jlink。

上几个測试通过的图片:

串口发送和接收:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluZ3FpbmdseQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

安卓4.3,nRF UART软件连接。发送接收数据:




版权声明:本文博客原创文章,博客,未经同意,不得转载。

1_BLE nRF51822 UART 与 BLE转发的更多相关文章

  1. [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程

    前言:  nRF51可以支持基于2.4G的互相通信.与NRF24LE1的通信.与NRF24LU1的通信.与NRF24L01的通信. 一.nRF51822基于2.4G和nRF51822通信 其中nRF5 ...

  2. [蓝牙] 6、基于nRF51822的蓝牙心率计工程消息流Log分析(详细)

    开机初始化Log Log编号 函数名   所在文件名 000001: main ..\main.c 000002: timers_init ..\main.c 000003: gpiote_init ...

  3. nrf51822裸机教程-SPI(主)

    关于SPI总线的介绍这里就不细说了,网上有很多介绍SPI总线时序的. SPI总线的本质就是一个环形总线结构,在时钟驱动下两个双向移位寄存器进行数据交换. 所以SPI总线的特色就是:传输一字节数据的同时 ...

  4. NRF51822和NRF52832的主要区别

    对于NRF51822和NRF52832的选择性相信大家也是非常困惑的,哪个性价比高?下面为大家讲下NRF51822和NRF52832的一个区别,让大家能够更好的快速选型加快研发产品进度!   主要分为 ...

  5. nrf528xx bootloader 模块介绍(转载)

    转载https://www.cnblogs.com/rfnets/p/8205521.html 1. bootloader 的基本功能: 启动应用 几个应用之间切换 初始化外设 nordic nrf5 ...

  6. nrf528xx bootloader 模块介绍

    1. bootloader 的基本功能: 启动应用 几个应用之间切换 初始化外设 nordic nrf52xxx的bootloader主要功能用来做DFU, 可以通过HCI, UART 或BLE通信的 ...

  7. [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...

  8. nRF51822之app_button控制uart的开启和关闭

    为什么要使用app_button来控制uart的开启和关闭 还是先上datesheet中uart开启的时候需要HFCLK,需要消耗大量大电流.所以在我们需要的时候需要通过io来通知nrf51822开启 ...

  9. Bluefruit LE Sniffer - Bluetooth Low Energy (BLE 4.0) - nRF51822 驱动安装及使用

    BLE Sniffer https://www.adafruit.com/product/2269 Bluefruit LE Sniffer - Bluetooth Low Energy (BLE 4 ...

随机推荐

  1. Yaha,Yaho

    Yaha: Yaho: 听雪楼上听雪落,雪落无声空余楼. 同样的地方,一坐三年多,人走楼空,回顾空留. 自己非常白痴地画着苹果,非常嗨森地逗自己玩. 这两层精致的书库是大学里面能容纳我的地方(ABC的 ...

  2. 介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7

    原文:介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7 toad for sqlserver5.7 虽然SSMS很好很强大,不过有时候使用一些第三方工具可以 ...

  3. 查询系统--基于Solr4.9.0实现

    为什么非要搜索系统 随着在产品的数量的增长.和复杂的检索要求,直接从数据库中检索信息,它已经无法满足展示机搜索需求. 实例: keyword=%E8%8B%B9%E6%9E%9C&enc=ut ...

  4. Notes系统安全日志

    最近出现了一些不正常的操作系统,但到目前为止,只有一个粗略的验证,然而,彻底清除.对于安全日志系统中的一些总结. 1.系统登录必须先登录 该日志必须包含:登录时间.注销时间.登录ip.主机名.MAC住 ...

  5. 三款经常使用IP发包工具介绍

    AntPower 版权全部© 2003 技术文章http://www.antpower.org 第1 页共14 页AntPower-技术文章三款经常使用IP 发包工具介绍小蚁雄心成员郎国军著lgj@q ...

  6. linux0.11学习笔记(2)

    makefile文件: makefile 文件是make 实用简介.make 程序是用Makefile最后一次改变的数据文件和代码文件(last-modification time)确定哪些文件需要更 ...

  7. Install shipyard

    2台机器,192.168.1.153,192.168.1.154 安装Shipyard 1. 154作为集群主节点,在154机器上执行命令 curl -sSL https://shipyard-pro ...

  8. c# webbrowser  获取用户选中文字

    原文:c# webbrowser  获取用户选中文字 最近一直被一个问题困扰,有一个文本框,一个webbrowser控件,一个上下文菜单, webbrowser  获取用户选中文字" tit ...

  9. 使用Advanced Installer 自动部署 Arcgis Engine Runtime 10.0

    原文:使用Advanced Installer 自动部署 Arcgis Engine Runtime 10.0 目前采用Arcgis9.2 + c#(vs2008)作为程序开发平台,是一个不错的搭配. ...

  10. hdu4699 Editor 2013 多校训练第十场 D题 数列维护 splay | 线段树 | 栈!!!!!

    题意:维护一个文本编辑,并且查询最大前缀和. 写了splay,wa了13次 过了之后觉着特傻逼.发现题解两个栈就可以了,光标前后维护两个栈,维护前面的栈的前缀和 和 最大前缀和. 哎,傻逼,太弱了,还 ...