
【IoT】TI BLE CC2541 串口控制蓝牙详解
扫描从机设备 连接指定从机设备 获取RSSI值(信号强度) 向char1特征值写入数据 断开蓝牙连接 在进行本文步骤前,请先阅读相关技术文档。 请确保硬件与软件环境配置正确。 部分指令可能需要根据实际情况进行调整。
发布日期:2021-05-08 10:08:52
浏览次数:9
分类:精选文章
本文共 3797 字,大约阅读时间需要 12 分钟。
串口控制蓝牙开发指南
一、项目概述
本文以SimpleBLECentral工程为例,介绍了如何通过串口控制蓝牙设备的实现过程。具体步骤包括:
二、实验平台配置
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"); }}
六、注意事项
通过以上步骤,可以实现通过串口控制蓝牙设备的功能开发,满足低成本、低功耗的需求。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月06日 13时39分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
剑指 Offer 29. 顺时针打印矩阵
2019-03-05
Web基础应用 NFS服务基础 触发挂载
2019-03-05
create-react-app路由的实现原理
2019-03-05
PSI值
2019-03-05
海思Hi3531DV100开发环境搭建
2019-03-05
JavaScript上传下载文件
2019-03-05
QWaitCondition把异步调用封装成同步调用
2019-03-05
Linux驱动开发之PCIe Host驱动
2019-03-05
Vue.js Element Basic组件使用
2019-03-05
android 头像选择,裁剪全套解决方案,你值得拥有!
2019-03-05
MapReduce
2019-03-05
springboot swagger2
2019-03-05
shell(十)case的几个典型应用
2019-03-05
Linux环境变量配置错误导致命令不能使用(杂谈)
2019-03-05
openstack安装(六)镜像glance服务安装
2019-03-05
openstack安装(九)网络服务的安装--控制节点
2019-03-05
shell编程(六)语言编码规范之(变量)
2019-03-05
vim杂谈(三)之配色方案
2019-03-05
vim杂谈(五)之vim不加载~/.vimrc
2019-03-05
Linux杂谈之终端快捷键
2019-03-05