博客
关于我
【IoT】TI BLE CC2541 串口控制蓝牙详解
阅读量:372 次
发布时间:2019-03-05

本文共 3797 字,大约阅读时间需要 12 分钟。

串口控制蓝牙开发指南

一、项目概述

本文以SimpleBLECentral工程为例,介绍了如何通过串口控制蓝牙设备的实现过程。具体步骤包括:

  • 扫描从机设备
  • 连接指定从机设备
  • 获取RSSI值(信号强度)
  • 向char1特征值写入数据
  • 断开蓝牙连接
  • 二、实验平台配置

    1. 协议栈版本

    • 使用 BLE-CC254x-1.3.2协议栈

    2. 编译软件

    • IAR 8.20.2编译工具

    3. 硬件平台

    • Smart RF开发板(主芯片为CC2541)
    • USB Dongle

    4. PC环境

    • 友善串口调试助手

    三、协议栈与编译工具

    本项目基于 BLE 协议栈,使用 IAR 8.20.2 编译工具进行开发。硬件平台选用了 Smart RF 开发板,结合 CC2541 主芯片和 USB Dongle 进行调试。

    四、硬件与软件环境

    1. 硬件配置

    • Smart RF 开发板
    • USB Dongle

    2. 软件环境

    • IAR 8.20.2 编译工具
    • CC2541 芯片

    五、实验步骤说明

    1. 串口回调函数配置

    SerialApp.c 文件中添加串口回调函数:

    void sbpSerialAppCallback(uint8 port, uint8 event){    uint8 pktBuffer[SBP_UART_RX_BUF_SIZE];    (void)event;    if ((numBytes = Hal_UART_RxBufLen(port)) > 0)    {        (void)HalUARTRead(port, pktBuffer, numBytes);        CommondHandle(pktBuffer, numBytes);    }}

    2. AT指令处理函数

    CommondHandle 函数中实现以下功能:

    • 接收 AT 指令并返回 OK
    • 处理 AT+SCAN 指令,启动从机设备扫描
    • 处理 AT+CON[x] 指令,连接指定从机
    • 获取 RSSI 值
    • 向 char1 写入特征值
    • 处理断开连接指令 AT+DISCON

    3. ble 主机初始化

    注册回调函数并初始化蓝牙设备:

    static const gapCentralRoleCB_t simpleBLERoleCB ={    simpleBLECentralRssiCB,  // RSSI 回调函数    simpleBLECentralEventCB   // 事件回调函数};

    4. 扫描从机设备

    通过 AT+SCAN 指令启动从机扫描:

    if (length >= 7 && str_cmp(pBuffer + 3, "SCAN", 4) == 0){    simpleBLEScanning = TRUE;    simpleBLEScanRes = 0;    SerialPrintString("Discovering...\r\n");    GAPCentralRole_StartDiscovery(DEFAULT_DISCOVERY_MODE,                                   DEFAULT_DISCOVERY_ACTIVE_SCAN,                                   DEFAULT_DISCOVERY_WHITE_LIST);}

    5. 连接从机设备

    通过 AT+CON[x] 指令连接指定从机:

    if (length >= 7 && str_cmp(pBuffer + 3, "CON", 3) == 0){    uint8 tmp = pBuffer[5] - 48 - 1;    if (simpleBLEState == BLE_STATE_IDLE)    {        if (simpleBLEScanRes > 0)        {            peerAddr = simpleBLEDevList[tmp].addr;            addrType = simpleBLEDevList[tmp].addrType;            simpleBLEState = BLE_STATE_CONNECTING;            GAPCentralRole_EstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,                                         DEFAULT_LINK_WHITE_LIST,                                         addrType,                                         peerAddr);            SerialPrintString("Connecting:");            SerialPrintString((uint8*)bdAddr2Str(peerAddr));            SerialPrintString("\r\n");        }    }}

    6. 获取 RSSI 值

    通过 AT+RSSI 指令获取信号强度:

    if (length >= 7 && str_cmp(pBuffer + 3, "RSSI", 4) == 0){    if (simpleBLEState == BLE_STATE_CONNECTED)    {        if (!simpleBLERssi)        {            simpleBLERssi = TRUE;            GAPCentralRole_StartRssi(simpleBLEConnHandle, DEFAULT_RSSI_PERIOD);        }        else        {            simpleBLERssi = FALSE;            GAPCentralRole_CancelRssi(simpleBLEConnHandle);            LCD_WRITE_STRING("RSSI Cancelled", HAL_LCD_LINE_1);            SerialPrintString("RSSI Cancelled\r\n");        }    }}

    7. 向 char1 写入特征值

    通过 AT+WRITE[0xXX] 指令写入特征值:

    if (length >= 10 && str_cmp(pBuffer + 3, "WRITE0x", 7) == 0){    simpleBLECharVal = str2hex(pBuffer + 10);    if (simpleBLEState == BLE_STATE_CONNECTED && simpleBLECharHdl != 0 && simpleBLEProcedureInProgress == FALSE)    {        attWriteReq_t req;        req.handle = simpleBLECharHdl;        req.len = 1;        req.value[0] = simpleBLECharVal;        req.sig = 0;        req.cmd = 0;        status = GATT_WriteCharValue(simpleBLEConnHandle, &req, simpleBLETaskId);        if (status == SUCCESS)        {            simpleBLEProcedureInProgress = TRUE;        }    }}

    8. 断开连接

    通过 AT+DISCON 指令断开蓝牙连接:

    if (length >= 10 && str_cmp(pBuffer + 3, "DISCON", 6) == 0){    if (simpleBLEState == BLE_STATE_CONNECTING || simpleBLEState == BLE_STATE_CONNECTED)    {        simpleBLEState = BLE_STATE_DISCONNECTING;        gStatus = GAPCentralRole_TerminateLink(simpleBLEConnHandle);        SerialPrintString("Disconnecting\r\n");    }}

    六、注意事项

  • 在进行本文步骤前,请先阅读相关技术文档。
  • 请确保硬件与软件环境配置正确。
  • 部分指令可能需要根据实际情况进行调整。
  • 通过以上步骤,可以实现通过串口控制蓝牙设备的功能开发,满足低成本、低功耗的需求。

    转载地址:http://osswz.baihongyu.com/

    你可能感兴趣的文章
    MapReduce
    查看>>
    springboot swagger2
    查看>>
    shell(十)case的几个典型应用
    查看>>
    Linux环境变量配置错误导致命令不能使用(杂谈)
    查看>>
    openstack安装(六)镜像glance服务安装
    查看>>
    openstack安装(九)网络服务的安装--控制节点
    查看>>
    shell编程(六)语言编码规范之(变量)
    查看>>
    linux杂谈之特殊字符的打印和在各种软件如何打出
    查看>>
    vim杂谈(三)之配色方案
    查看>>
    vim杂谈(五)之vim不加载~/.vimrc
    查看>>
    Linux杂谈之终端快捷键
    查看>>
    vimscript学习笔记(二)预备知识
    查看>>
    vimscript学习笔记(三)信息打印
    查看>>
    awk杂谈之数组习题
    查看>>
    SSM项目中遇到Could not autowire. No beans of ‘XXX‘ type found.错误
    查看>>
    Linux网络属性配置详解
    查看>>
    Python(三十)类的理解
    查看>>
    Extjs布局详解
    查看>>
    Android数据库
    查看>>
    Linux基础命令(十四)软件安装的后续
    查看>>