【IoT】TI BLE CC2541 串口控制蓝牙详解
发布日期:2021-05-08 10:08:52 浏览次数:17 分类:精选文章

本文共 3879 字,大约阅读时间需要 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");
    }
    }

    六、注意事项

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

    上一篇:【IoT】Android/TI 蓝牙 profile 详解
    下一篇:【IoT】蓝牙BLE基础:CC2541 BLE临界资源保护

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年05月09日 17时47分17秒