NRF51822蓝牙服务(4)——串口透传

NRF52832串口接收错误,进入APP_UART_COMMUNICATION_ERROR 在进行nrf52832串口与计量芯片通信时,总是遇到APP_UART_COMMUNICATION_ERROR // 接收过程中发生通信错误 然后蓝牙就死掉了。emmmmmm… 总结三种可能性: 1 发送端发送了错误的帧, 在一个错误帧出现的情况下。如果再此帧中没有检测到有效的停止位会产生一个ERROR事件。 这个我没有遇到过; 2 芯片的RX引脚低电平 在中断时,如果 RXD 保持低电平超过一个数据帧长度时,也会产生一个 ERROR 事件。直接把RX接地,或者RX引脚浮空,都有可能出 阅读详情

前言

这一次我们尝试创建一个串口服务来实现手机与开发板的数据透传,其实无非就跟学习创建LED读写服务的时候一样创建一个私有服务而已。废话少说,我们直接开始实验。

实验分析

首先,我们要知道NRF51822的串口通信引脚:RX:P0.11,TX:P0.9,RTS:P0.10,CTS:P0.8。

接着,新建串口驱动文件:ble_nus.c和ble_nus.h

                

然后,写入串口初始化函数并添加到main函数中:

/**@brief  Function for initializing the UART module.
 */
/**@snippet [UART Initialization] */
static void uart_init(void)
{
    uint32_t                     err_code;
    const app_uart_comm_params_t comm_params =
    {
        RX_PIN_NUMBER,
        TX_PIN_NUMBER,
        RTS_PIN_NUMBER,
        CTS_PIN_NUMBER,
        APP_UART_FLOW_CONTROL_DISABLED,
        false,
        UART_BAUDRATE_BAUDRATE_Baud38400
    };//配置串口参数

    APP_UART_FIFO_INIT( &comm_params,
                       UART_RX_BUF_SIZE,
                       UART_TX_BUF_SIZE,
                       uart_event_handle,
                       APP_IRQ_PRIORITY_LOW,
                       err_code);
    APP_ERROR_CHECK(err_code);//配置串口FIFO缓冲,并初始化串口
}
/**@snippet [UART Initialization] */
/**@brief UART communication structure holding configuration settings for the peripheral.
 */
typedef struct
{
    uint8_t                 rx_pin_no;    /**< RX pin number. */
    uint8_t                 tx_pin_no;    /**< TX pin number. */
    uint8_t                 rts_pin_no;   /**< RTS pin number, only used if flow control is enabled. */
    uint8_t                 cts_pin_no;   /**< CTS pin number, only used if flow control is enabled. */
    app_uart_flow_control_t flow_control; /**< Flow control setting, if flow control is used, the system will use low power UART mode, based on CTS signal. */
    bool                    use_parity;   /**< Even parity if TRUE, no parity if FALSE. */
    uint32_t                baud_rate;    /**< Baud rate configuration. */
} app_uart_comm_params_t;

这里我们可以看到这里定义了一个app_uart_comm_params_t类型的变量,这个类型在app_uart.h文件内,是官方提供用户的初始化参数结构体,提高开发效率。这里我们在路径中包含:项目目录\components\libraries\uart。

串口设置里,首先配置串口端口,波特率等串口参数,再使用函数APP_UART_FIFO_INIT配置串口缓冲并且初始化串口,APP_UART_FIFO_INIT函数中调用了app_uart_init初始化函数,把我们配置的串口参数传导设置中,函数具体如下,有4个形参,分别为1:串口通用参数;2:串口缓冲;3:串口中断事件;4:串口中断优先级;

uint32_t app_uart_init(const app_uart_comm_params_t * p_comm_params,
                             app_uart_buffers_t *     p_buffers,
                             app_uart_event_handler_t event_handler,
                             app_irq_priority_t       irq_priority)
{
    uint32_t err_code;

    m_event_handler = event_handler;

    if (p_buffers == NULL)
    {
        return NRF_ERROR_INVALID_PARAM;
    }

    // Configure buffer RX buffer.
    err_code = app_fifo_init(&m_rx_fifo, p_buffers->rx_buf, p_buffers->rx_buf_size);
    if (err_code != NRF_SUCCESS)
    {
        // Propagate error code.
        return err_code;
    }

    // Configure buffer TX buffer.
    err_code = app_fifo_init(&m_tx_fifo, p_buffers->tx_buf, p_buffers->tx_buf_size);
    if (err_code != NRF_SUCCESS)
    {
        // Propagate error code.
        return err_code;
    }

    nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG;
    config.baudrate = (nrf_uart_baudrate_t)p_comm_params->baud_rate;
    config.hwfc = (p_comm_params->flow_control == APP_UART_FLOW_CONTROL_DISABLED) ?
            NRF_UART_HWFC_DISABLED : NRF_UART_HWFC_ENABLED;
    config.interrupt_priority = irq_priority;
    config.parity = p_comm_params->use_parity ? NRF_UART_PARITY_INCLUDED : NRF_UART_PARITY_EXCLUDED;
    config.pselcts = p_comm_params->cts_pin_no;
    config.pselrts = p_comm_params->rts_pin_no;
    config.pselrxd = p_comm_params->rx_pin_no;
    config.pseltxd = p_comm_params->tx_pin_no;

    err_code = nrf_drv_uart_init(&config, uart_event_handler);

    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    nrf_drv_uart_rx_enable();
    return nrf_drv_uart_rx(rx_buffer,1);
}

接下来,就是协议栈相关初始化。首先,在services_init函数中添加自己的服务:

/**@brief Function for initializing services that will be used by the application.
 */
static void services_init(void)
{
    uint32_t       err_code;
    ble_nus_init_t nus_init;
    
    memset(&nus_init, 0, sizeof(nus_init));

    nus_init.data_handler = nus_data_handler;
    
    err_code = ble_nus_init(&m_nus, &nus_init);
    APP_ERROR_CHECK(err_code);
}

在这里,我们将nus_data_handler作为串口传输处理句柄,作为回调函数。这个函数用来处理串口UART发送数据和从接收串口端来的数据。这个句柄函数也非常简单,直接调用外设函数:

/**@snippet [Handling the data received over BLE] */
static void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length)
{
    for (uint32_t i = 0; i < length; i++)
    {
        while(app_uart_put(p_data[i]) != NRF_SUCCESS);
    }
    while(app_uart_put('\n') != NRF_SUCCESS);
}
/**@snippet [Handling the data received over BLE] */

然后添加串口蓝牙服务声明ble_nus_init函数。

接着,我们来设计服务驱动文件:

ble_nus.h:

/**@brief Nordic UART Service structure.
 *
 * @details This structure contains status information related to the service.
 */
struct ble_nus_s
{
    uint8_t                  uuid_type;               /**< UUID type for Nordic UART Service Base UUID. */
    uint16_t                 service_handle;          /**< Handle of Nordic UART Service (as provided by the S110 SoftDevice). */
    ble_gatts_char_handles_t tx_handles;              /**< Handles related to the TX characteristic (as provided by the S110 SoftDevice). */
    ble_gatts_char_handles_t rx_handles;              /**< Handles related to the RX characteristic (as provided by the S110 SoftDevice). */
    uint16_t                 conn_handle;             /**< Handle of the current connection (as provided by the S110 SoftDevice). BLE_CONN_HANDLE_INVALID if not in a connection. */
    bool                     is_notification_enabled; /**< Variable to indicate if the peer has enabled notification of the RX characteristic.*/
    ble_nus_data_handler_t   data_handler;            /**< Event handler to be called for handling received data. */
};

uint32_t ble_nus_init(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init);
void ble_nus_on_ble_evt(ble_nus_t * p_nus, ble_evt_t * p_ble_evt);
uint32_t ble_nus_string_send(ble_nus_t * p_nus, uint8_t * p_string, uint16_t length);

这里用到一个ble_nus_t结构体指针,这个类型用于引用这个服务实例;ble_nus_init_t用于初始化参数;ble_evt是常见的事件类型,在官方ble.h头文件中定义。

ble_nus_string_send用于串口连接状态变化,并进行反馈。

这里再着重看一下ble_nus_t结构体中添加ble_gatts_char_handles_t类型的tx_handles和rx_handles特征值操作句柄:

/**@brief GATT Characteristic Definition Handles. */
typedef struct
{
  uint16_t          value_handle;       /**< 处理的特征值. */
  uint16_t          user_desc_handle;   /**< 用户描述句柄:句柄向用户说明,或ble_gatt_handle_invalid不存在. */
  uint16_t          cccd_handle;        /**< 客户的特征描述符配置(CCCD)句柄. */
  uint16_t          sccd_handle;        /**< 服务器的特征描述符配置(SCCD)句柄. */
} ble_gatts_char_handles_t;

客户端特性配置描述符(CCCD),这个描述符是给任何支持通知或指示功能的特性额外增加的。在CCCD中写入“1”使能通知功能,写入“2”使能指示功能,写入“0”同时禁止通知和指示功能。

一个特性至少包含2个属性:一个属性用于声明,一个属性用于存放特性的值。

所有通过GATT服务传输的数据必须映射成一些列的特性,可以把特性中的这些数据看成是一个个捆绑起来的数据,每个特性就是一个自我包容而独立的数据点。例如,如果几个数据总是一起变化,那么我们可以把他们集中在一个特性里。

任何在特性中的属性不是定义为属性值就是描述符。描述符是一个额外的属性以提供更多特性的信息,它提供一个用户可以识别的特性描述的实例。

接着,我们在应用层中把串口的事件处理函数加入ble_evt_dispatch函数中:

static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
    ble_conn_params_on_ble_evt(p_ble_evt);
    ble_nus_on_ble_evt(&m_nus, p_ble_evt);
    on_ble_evt(p_ble_evt);
    ble_advertising_on_ble_evt(p_ble_evt);
    bsp_btn_ble_on_ble_evt(p_ble_evt);
    
}

最后,我们将uart_init注册的uart_event_handle函数实体加上:

//timer handler
uint8_t clean_index_cnt = 0;
uint8_t uart_index = 0;
static void time_timeout_handler(void *p_context)
{
	UNUSED_PARAMETER(p_context);
	if(clean_index_cnt < 20)
		clean_index_cnt++;
	if(clean_index_cnt >= 10)
	{
		uart_index = 0;
	}
}

static bool checksum(uint8_t *pbuffer)
{
	uint8_t i;
	uint8_t sum = 0;
	for(i=0;i<(pbuffer[1]+2);i++)
	{
		sum += pbuffer[i];
	}
	if(sum == pbuffer[(pbuffer[1]+2)])
		return true;
	else
		return false;
}
void uart_event_handle(app_uart_evt_t * p_event)
{
    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
    uint32_t       err_code;

    switch (p_event->evt_type)
    {
        case APP_UART_DATA_READY:
            UNUSED_VARIABLE(app_uart_get(&data_array[uart_index]));
            uart_index++;

			clean_index_cnt = 0;
			if(uart_index == (data_array[1] + 3))
			{
				if(checksum(data_array))
				{
					err_code = ble_nus_string_send(&m_nus, data_array, uart_index);
					if (err_code != NRF_ERROR_INVALID_STATE)
					{
						APP_ERROR_CHECK(err_code);
					}
				}
				uart_index = 0;
			}
            break;

        case APP_UART_COMMUNICATION_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_communication);
            break;

        case APP_UART_FIFO_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_code);
            break;

        default:
            break;
    }
}

APP_TIMER_DEF(m_timer_id);
static void timers_init(void)
{
	uint32_t err_code;
	
	APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
	err_code = app_timer_create(&m_timer_id, APP_TIMER_MODE_REPEATED, time_timeout_handler);
	APP_ERROR_CHECK(err_code);
}

这里,我为了可以兼容项目的数据帧,将处理函数加了一些处理,同时开一个定时器做串口的超时处理。

定时器在main函数中启动:

到这里,就已经完成了串口服务的所有操作。

结果验证

  • 手机连接蓝牙,我们可以看到一个UUID为FFF0的服务
  • 这个服务包含notity和write特性
  • 打开write特性,往特性里写入任意小于20个字节的数据,可以发现PC的串口调试助手正常收到数据

总结

通过这个实验,我们学会了如何开发一个蓝牙串口透传功能。

 

 

 

 

从硬件到软件玩转Nordic nRF52840 低功耗蓝牙 有兴趣,从硬件到软件自己来DIY。 阅读详情

相关推荐

ESP32 ESP-IDF UART使用模式检测中断报告事件实现 收发数据

官网esp-idf参考代码:D:\esp-idf\examples\peripherals\uart\uart_events 开发环境:Source Insight + esp-idf esp32模块:ESP32-WROOM-32 实现功能:使用ESP32的3个UART全部实现收发,要求3个UART同时接收每条数据长度25间隔时间为100ms。 初期看了一下官网的uart例程代码...

sudaroot的博客 8565

ble

讲解2点:        为什么 nordic的4.0协议栈中ble只能发送20字节的应用负载数据。        大量数据发送时如何提高发送速率 1:为何上层应用负载每次最多20字节 首先了解 4.0中链路层的包格式如下:        PDU即协议数据单元,即链路层的负载数据。应用层用户发送的数据就是在这里面,但是并不全是用户数据。 Ble有分广播态和连接态。

liuyonggy的博客 3102

nRF51822蓝牙开发

文章目录一、nRF51822芯片介绍二、Keil环境搭建1、下载软件包2、选择设备3、配置JLINK三、nRFgo的下载四、蓝牙协议栈(一)、S110(二)、S120(三)、S130五、串口透传例程(一)、应用程序定时器(心跳)初始化(二)、串口初始化(三)、flash初始化(四)、定时器初始化(五)、蓝牙协议栈初始化(六)、GAP参数初始化(七)、服务初始化(八)、GAP广播初始化(九)、蓝牙连...

oyzy_Sean的篝火 2900

第十八节 协议栈UART实验

第十八节 协议栈UART实验 协议栈中已经用了串口的驱动,我们要做的只是对串口进行初始化,然后就可以进行串口数据的收发了。 用使用串口,第一步,需要打开使能串口功能,通过配置工程来实现,这里注意,我们现在不使用USB的CDC类来实现串口,所以HAL_UART_USB=FALSE。 HAL_UART=TRUE HAL_UART_USB=FALSE 要使用串口必须先初始化相应的串口,

虚拟旅行者的专栏 2183

基于蓝牙BLE的220V智能开关DIY:从电路设计到手机控制全解析

蓝牙低功耗(BLE)技术作为一种成熟的短距离无线通信协议,以其低功耗、低成本和高集成度的特点,在物联网设备控制领域广泛应用。其工作原理基于主从设备间的广播与连接机制,通过GATT协议进行数据交换,为智能家居、穿戴设备等场景提供了便捷的本地化控制方案。在工程实践中,BLE模块常通过串口透传模式简化开发,将复杂的射频通信转化为简单的数据收发,极大降低了嵌入式开发门槛。本文聚焦于如何利用BLE技术,结合可控硅驱动与隔离电源设计,实现一个完全本地化、可自定义的220V交流电智能开关方案,并详细解析了从核心模块选型、

weixin_30765577的博客 456

nrf51822+MPU6050蓝牙姿态采集系统,含易安卓手机端APK与完整工程源码

基于nrf51822蓝牙芯片和MPU6050六轴传感器,实现本地姿态解算与实时BLE上传。硬件部分使用SDK11.0构建BLE服务,支持翻滚角、俯仰角、航向角等融合姿态数据稳定广播;配套已编译的Android APK(发布版_BLE信息显示.apk),安装后可直连查看动态角度值,无需额外配置;同时提供全部易安卓(E4A)源码(BLE信息.e4a),包含登录验证界面、蓝牙连接管理、实时数据显示页,支持UI定制、协议替换或功能扩展;工程内含完整驱动代码(位于BLE_MPU6050_SDK11.0目录)、外部组件

convnet3designer的博客 259

nrf51822蓝牙学习笔记四

UUID、透传、flash、数据分析、mac地址、功率、rssi

Moliam的博客 3310

3DMax高效建模与人工智能:一场颠覆传统创作的效率革命

AI与3DMax的结合,不仅是工具效率的升级,更是一场创作范式的革命。从“手动雕刻”到“智能共生”,设计师的角色正从执行者转向决策者。正如网友所言:“AI不是替代人类,而是赋予凡人以神笔。”在这场变革中,唯有拥抱技术、深耕创意,方能在数字艺术的浪潮中立于潮头。参考文献与工具推荐技术原理:火星时代资讯《人工智能和三维建模》工具实测:哔哩哔哩《tyDiffusion 3dsMax应用》9、Tripo AI官网教育案例:原创论文《人工智能技术介入三维动画课程建设》

m0_46478534的博客 3008

蓝牙概述+nrf51822串口数据透传的程序

蓝牙的概述

忧愁的awe的博客 5806

STM32+A4988控制步进电机

基于A4988芯片驱动42步进电机,在STM32F1上进行测试,最高可以实现16细分。

个人博客 4万+

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 355

nrf51822 --- 串口透传 分析

1.目的      分析蓝牙串口的例子 2.分析   在实际应用中经常使用串口,下面我们就来分析下串口例子 3.平台: sofeDevice : s110_nrf51_8.0.0_softdevice.hex 协议栈版本:SDK10.0.0 编译软件:keil 5.12 硬件平台:nrf51822最小系统 例子:SDK 10.0.0\example

a369000753的博客 1万+

【BAT32G113-仿真器及脱机烧录器教程-A3-2024/9/19】

提示:此壁纸收集于互联网,如有侵权,请联系作者!今日下班,闲来无事,就与生活中在乎的人闲日常,互相彼此增进一些友谊或爱意情愫!在座的朋友看到这里,有时间,抽抽空,多多联系一下,身边重要的人哟!四种指示灯和一个按钮:MODE->代表红色POWER->代表黄色ACTIVE->代表蓝色STATUS->代表XX(不记得了)黑色按钮:按键上电,会进入升级模式,这里我们一般默认不需要改变!仿真工具-ICE8-PRO介绍隶属于产品分支里。烧写工具-CMS-WRITER8 LITE介绍点击。

星新计划的博客 8259

基于nRF51822的BLE 4.0开发实战:从核心概念到功耗优化

低功耗蓝牙(BLE)作为一种专为物联网优化的短距离无线通信技术,其核心在于GATT(通用属性配置文件)定义的服务器-客户端模型,通过服务、特征等结构化数据实现高效、标准的设备交互。这一原理使得BLE在传感器数据采集、智能穿戴等场景中,能实现微安级的超低功耗与可靠的连接。在实际工程中,基于Nordic nRF51822这类经典芯片的开发,常涉及连接间隔、广播参数等关键配置的调优,以平衡功耗与性能。本文聚焦于nRF51822模块,深入探讨其开发环境搭建、自定义服务实现及功耗优化等实战技巧,为理解和应用低功耗蓝牙

weixin_29172201的博客 223

STM32开发 -- 4G模块开发详解(1)

这部分一直再看,资料都已经整理好了,但是一直没有汇总。接下来就详细的看一下,GSM这部分是怎么实现的。

不积跬步,无以至千里 5万+

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集

将该路径修改到config/semanticktti.yaml文件中的data_path节点下。下载semanticKITTI数据集的点云数据和标签,解压到一起。系统:Ubuntu18。

zhaoguanhua的博客 2594

Xadow BLE双模模块开发全解析:从nRF51822硬件到低功耗物联网应用

蓝牙低功耗(BLE)技术作为现代物联网设备的核心通信协议,通过优化的广播与连接机制实现了极低的功耗,使其在电池供电的传感器节点和可穿戴设备中广泛应用。其工作原理基于GATT(通用属性协议)架构,以特征值(Characteristic)为数据载体,支持读、写、通知等操作,为设备间高效、灵活的数据交换提供了标准框架。这项技术的核心价值在于平衡了功耗、成本与连接可靠性,极大地推动了智能家居、健康监测、资产追踪等场景的普及。本文以Seeed Studio的Xadow BLE双模模块为例,深入剖析其采用的nRF518

weixin_30263073的博客 362

YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml

全网最详细的YOLOv5源码解读之配置文件yaml。逐行注释,逐句讲解,一文带你了解yaml。小白必看!

路人贾的博客 1万+

nRF51822浅谈蓝牙低功耗(BLE)应用领域及干货分析

·        从手机、平板、PC到车载设备, ·        到耳机、游戏手柄、音响、电视, ·        再到手环、电子秤、智能医疗器械(血糖仪、数字血压计、血气计、数字脉搏/心率监视器、数字体温计、耳温枪、皮肤水分计等), ·        再到智能家居等领域均占有一席之地。     主流的BLE芯片有TI的TI CC2540/2541、CSR BC6130、创杰

qq_38254768的博客 2749

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ATK-BLE4.0蓝牙调试工具使用指南

本文介绍ATK-BLE4.0蓝牙调试模块的特性与应用,支持BLE 4.0、串口透传、主从一体模式,配合AT指令和上位机软件,可快速实现STM32等单片机的无线通信开发,适用于温湿度监控等物联网原型验证场景。

weixin_42103128的博客 1122

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[嵌入式方案][nrf51822][LSC-01] BLE模块 从机 AT指令 BLE HID NUS 密码配对 自动回连 电量显示 OTA DFU DTM 定频 4路PWM 2路ADC4路自定义IO

本文介绍一款低功耗蓝牙从机模组,支持 BLE4.2 协议,可连接苹果、安卓、PC 及小程序等主流设备。

嵌入式单片机实验室 1455

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机、平板、PC到车载设备, 到耳机、游戏手柄、音响、电视, 再到手环、电子秤、智能医疗器械(血糖仪、数字血压计、血气计、数字脉搏/心率监视器、数字体温计、耳温枪、皮肤水分计等), 再到智能家居等领域均占有一席之地。   而蓝牙低功耗(BLE)是在蓝牙4.0协议上修改以适用低功耗应用场景的一种蓝牙协议。   随着上一股...

weixin_34087301的博客 998

nrf51822 串口透传广播数据抓包讲解

广播报文     1           2                     3                 4                                   5                      6                                                           7

一土博客 4113

浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)

转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机、平板、PC到车载设备, 到耳机、游戏手柄、音响、电视, 再到手环、电子秤、智能医疗器械(血糖仪、数字血压计、血气计、数字脉搏/心率监视器、数字体温计、耳温枪、皮肤水分计等), 再到智能家居等领域均占有一...

分享信息化知识 2491
上一篇: NRF51822蓝牙服务(3)——电池电量采集
下一篇: NRF51822蓝牙服务(5)——FLASH存储数据
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值