本文共 3797 字,大约阅读时间需要 12 分钟。
本文以SimpleBLECentral工程为例,介绍了如何通过串口控制蓝牙设备的实现过程。具体步骤包括:
本项目基于 BLE 协议栈,使用 IAR 8.20.2 编译工具进行开发。硬件平台选用了 Smart RF 开发板,结合 CC2541 主芯片和 USB Dongle 进行调试。
在 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); }}
在 CommondHandle
函数中实现以下功能:
注册回调函数并初始化蓝牙设备:
static const gapCentralRoleCB_t simpleBLERoleCB ={ simpleBLECentralRssiCB, // RSSI 回调函数 simpleBLECentralEventCB // 事件回调函数};
通过 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);}
通过 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"); } }}
通过 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"); } }}
通过 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; } }}
通过 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/