
【IoT】TI BLE CC2541 串口控制蓝牙详解
扫描从机设备 连接指定从机设备 获取RSSI值(信号强度) 向char1特征值写入数据 断开蓝牙连接 在进行本文步骤前,请先阅读相关技术文档。 请确保硬件与软件环境配置正确。 部分指令可能需要根据实际情况进行调整。
发布日期:2021-05-08 10:08:52
浏览次数:17
分类:精选文章
本文共 3879 字,大约阅读时间需要 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"); }}
六、注意事项
通过以上步骤,可以实现通过串口控制蓝牙设备的功能开发,满足低成本、低功耗的需求。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年05月09日 17时47分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ECSHOP实现收货国家省市由选择下拉菜单改为手动
2025-03-29
ECShop模板原理
2025-03-29
edgeboxes proposal 和dpm 连接
2025-03-29
EdgeX Foundry:开启边缘计算新时代
2025-03-29
Educational Codeforces Round 28
2025-03-29
ed编辑器--适用于shell脚本内编辑文件的最最简单编辑器
2025-03-29
EF 资料
2025-03-29
EF6与MVC5系列(4):在MVC应用程序中使用弹性连接和命令拦截
2025-03-29
Effective Modern C++:02auto
2025-03-29
efficientnet最合适的尺寸和最后一层的层数
2025-03-29
Ehcache Java开源缓存框架
2025-03-29
EhCache 分布式缓存/缓存集群
2025-03-29
EHR:对人力资源信息系统的认识
2025-03-29
EJB学习笔记六(EJB中的拦截器)
2025-03-29
el-form表单重置后输入失效
2025-03-29
el-select下拉框修改背景色
2025-03-29
el-table select事件判断当前项是否勾选
2025-03-29
Elasticsearch & Kibana & Filebeat开启SSL通信
2025-03-29
ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案
2025-03-29