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

本文共 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");    }}

    六、注意事项

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

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

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年04月06日 13时39分02秒