版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MemsanGZmInG/article/details/117320456
作者:MemsanGZmInG
日期:2021-05-27

如何在Silicon Labs的EFR32BG22程序中添加AT指令控制

关于EFR32BG22

EFR32BG22 (BG22) 蓝牙低功耗 (LE) 无线 SoC 解决方案是无线 Gecko 系列 2 平台的一部分。BG22 系列同类最优的超低传输和接收功率(4.1 mA TX @ 0 dBm、3.6 mA RX)和高性能、低功耗 Arm® Cortex®-M33 内核(27 µA/MHz 活动、1.2 µA 睡眠)的组合提供业界领先的能源效率,可使钮扣电池寿命延长到多达十年。目标应用包括蓝牙网状网络低功耗节点、智能门锁、个人医疗保健和健身设备。资产跟踪标签、信标和室内导航也将受益于 SoC 的多用途蓝牙到达角 (AOA) 和出发角 (AOD) 功能以及亚米级定位精度。

开发环境

软件:Simplicity Studio 4
芯片:EFR32BG22C224F512IM32(同类BG22系列芯片亦可)

关于Simplicity Studio
Silicon Labs拥有自己的开发工具Simplicity Studio,Simplicity Studio 旨在简化开发人员工作流程,因为它能够智能地识别 Silicon Labs 发布的所有评估和开发套件,从而让用户轻松获得适当的 SDK 和开发资源。 Simplicity Studio 还提供功能丰富的基于 Eclipse 和 GNU 工具链的 IDE,开发人员还可以结合其自身的开发环境使用 Simplicity Studio 的其他功能。

编写

EFR32BG22易于开发的其中一个原因就是拥有非常丰富的API接口,开发者即使没有任何蓝牙堆栈开发的经验也能轻易开发。同时,在Silicon Labs的官网上也有许多例程供我们学习。

以官网的v2.13开发文档中的例程为例(链接在这里,很实用的一个主从透传例程)

进入AT模式前的准备
在透传过程中直接使用AT指令进行控制是不明智的,一是在有数据传输时二者都打印出来容易干扰数据,看起来也很乱,二是在传输数据时修改参数可能会对系统内部堆栈产生不可预知的影响,因此,在使用AT指令控制时,应将其透传功能屏蔽。
1.模块在未连接状态时,进入AT配置模式后应停止扫描(server)/ 广播(client),以免在连接到其他设备时串口打印其他东西干扰参数配置;
2.模块在已连接状态时,屏蔽其透传功能,原因上面已经说了。

进入AT配置模式

uint8_t at_mode_flag = 0;at_mode_flag = 1;
printLog("\r\n*******************\r\n");
printLog("*     AT mode     *\r\n");
printLog("*******************\r\n");
gecko_cmd_hardware_set_soft_timer(0, GPIO_POLL_TIMER, 0);//禁用按键轮询扫描
//在spp_server_main.c文件中
if (_main_state == STATE_ADVERTISING)
{gecko_cmd_le_gap_start_advertising(0, le_gap_non_discoverable, le_gap_non_connectable);//广播不可连接的广播包
}
//在spp_client_main.c文件中
if (_main_state == SCANNING)
{gecko_cmd_le_gap_end_procedure();      //stop discovery_main_state = DISCONNECTED;
}

读取串口数据

static void send_spp_data()
{uint8 len = 0;uint8 data[256];uint16 result;int c;int timeout = 0;// Read up to _max_packet_size characters from local bufferwhile (len < _max_packet_size) {c = RETARGET_ReadChar();if (c >= 0) {data[len++] = (uint8) c;} else if (len == 0) {/* If the first ReadChar() fails then return immediately */return;} else {/* Speed optimization: if there are some bytes to be sent but the length is still* below the preferred minimum packet size, then wait for additional bytes* until timeout. Target is to put as many bytes as possible into each air packet */// Conditions for exiting the while loop and proceed to send data:if (timeout++ > UART_POLL_TIMEOUT) {break;} else if (len >= _min_packet_size) {break;}}}if (at_mode_flag == 1){at_commands(_conn_handle, data, len);}else if (len > 0) {// Stack may return "out-of-memory" error if the local buffer is full -> in that case, just keep trying until the command succeedsdo {result = gecko_cmd_gatt_write_characteristic_value_without_response(_conn_handle, _char_handle, len, data)->result;_sCounters.num_writes++;} while (result == bg_err_out_of_memory);if (result != 0) {printLog("Unexpected error: %x\r\n", result);} else{_sCounters.num_pack_sent++;_sCounters.num_bytes_sent += len;}}len = 0;memset(data, 0, len);
}

现在,透传功能被屏蔽,我们可以在串口写入AT指令来进行控制了。

简单的几个AT指令

void at_commands(uint8_t connection, char* data, uint8_t len)
{if (len == 0){return;}if (len >= 4 && data[0] == 'A' && data[1] == 'T' && data[len-2] == '\r' && data[len-1] == '\n'){//输入测试指令“AT”if (len == 4){printLog("OK\r\n");}//读取模块mac地址,这个函数在生成的例程中有提供else if (strncmp("AT+LADDR\r\n", data, len) == 0)  {printLog("+LADDR=");AT_Search_LADDR();printLog("\r\n");}//修改模块名称,这里被限制名称最多不能超过8个字节,实际是可以不止8个的。可以根据实际情况修改else if (len > 10 && len < 19 && data[2] == '+' && data[3] == 'N' && data[4] == 'A' && data[5] == 'M' && data[6] == 'E'){uint8_t dataname[8] = {0};printLog("+NAME=");     int len = strlen(data);int j = 0;for (int i = 7; i < len-2; i++,j++){dataname[j] = (uint8_t)data[i];printLog("%c", dataname[j]);}dataname[j] = '\0';gecko_cmd_gatt_server_write_attribute_value(gattdb_device_name, 0, strlen(dataname), dataname);printLog("\r\nOK\r\n");}//断开蓝牙连接else if (strncmp("AT+DISC\r\n", data, len) == 0){if (connection != 0XFF){gecko_cmd_le_connection_close(connection);printLog("OK\r\n");}}//修改发射功率else if (len == 11 && data[2] == '+' && data[3] == 'P' && data[4] == 'O' && data[5] == 'W' && data[6] == 'E' && data[7] == 'R' ){printLog("+POWER=");//修改发射功率时必须暂停系统堆栈进程gecko_cmd_system_halt(1);if (data[8] >= '0' && data[8] <= '6'){printLog("%d\r\n", gecko_cmd_system_set_tx_power(data[8]*10)->set_power/10);printLog("\r\nOK\r\n");}gecko_cmd_system_halt(0);}//退出AT配置模式else if (strncmp("AT+EXIT\r\n", data, len) == 0){printLog("OK\r\n");AT_EXIT();}}
}

最好不要使用strcmp,否则容易出现AT指令无响应的问题

退出AT配置模式时,上述进入AT配置模式时的操作都要尽数恢复。

void AT_EXIT(void)
{if (_main_state == DISCONNECTED){gecko_cmd_le_gap_start_discovery(1, le_gap_discover_generic);}else if (_main_state == STATE_ADVERTISING){gecko_cmd_le_gap_start_advertising(0, le_gap_general_discoverable, le_gap_undirected_connectable);}at_mode_flag = 0;printLog("\r\n*******************\r\n");printLog("*   Exit AT mode  *\r\n");printLog("*******************\r\n");
}

进入AT配置模式后可以做很多东西,包括手动扫描、连接设备;读取、修改掉电参数。甚至可以通过修改掉电参数在下次启动后使用新的UUID值或者添加新的服务,让蓝牙连接的条件变的更加灵活。

EFR32--如何在EFR32BG22透传中添加AT指令控制相关推荐

  1. 如何在github存储库中添加屏幕截图到README?

    本文翻译自:How to add screenshot to READMEs in github repository? Is it possible to place a screenshot in ...

  2. 如何在Linux kernel Makefile中添加宏定义

    如何在Linux kernel Makefile中添加宏定义: CFLAGS_object.o += -DMACRO_NAME 在编译object.o时定义宏MACRO_NAME,在kernel中添加 ...

  3. 如何在Adobe DW CC2017中添加服务器行为、数据库和绑定面板

    如何在Adobe DW CC2017中添加服务器行为.数据库和绑定面板 如何给dw cc2017安装插件. 1.安装DMXzone Extension Manager. https://pan.bai ...

  4. access数据库中怎么添加计算机,如何在Access 2007数据库中添加附件 -电脑资料

    Access允许您在数据库表中包含附件, 1. 首先使用Access 2007打开Access数据库. 2. 在"设计视图"中打开您想要添加附件的表. 3. 在"字段名称 ...

  5. ubuntu添加路由_如何在Ubuntu,Linux中添加新路由?

    ubuntu添加路由 I have a box with Ubuntu Linux and I want to add a new route to my box. Because I want to ...

  6. 如何在ppt或word中添加高亮代码?

    如何在ppt或word中添加高亮代码? 问题: 如何ppt中添加带有语法高亮的程序代码,就如同下面的形式(在ppt嵌入高亮代码,且可以编辑,带有行号) 详细的要求如下: 1.代码带有语法高亮. 2.结 ...

  7. 如何在 Cell 组件/插件中添加下拉树形控件

    引言 用友华表Cell控件在提供强大的报表功能的同时,在关键细节也是十分突出,为开发者进一步缩短开发周期和最终用 户的完美需求提供了有效有利的平台.下面的例子提供了VB语言对实现美观实用的下拉树形控件 ...

  8. 在C++程序中添加逻辑流程控制

    在C++ 程序中添加逻辑流程控制          问题的引出 在计算机程序中,除了常见的执行流程控制,还有逻辑流程控制:有时,执行流程即为逻辑流程,但在大多数情况下还是有所区别的,例如,假定有一个W ...

  9. iphone中怎么添加邮箱_如何在iPhone的Gmail中添加附件

    iphone中怎么添加邮箱 While email is still an incredibly popular form of communication, it's not always a pa ...

最新文章

  1. python3.7正则表达式语法_python3正则表达式的几个高级用法
  2. 数据产品经理修炼手册pdf_【尼读书】数据产品经理修炼手册(附思维导图)
  3. 云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航
  4. 量子算法入门书籍推荐
  5. access_token is invalid or not latest hint
  6. 【毕业设计】java银行帐目管理系统(源代码+论文)
  7. txt转excel,添加数据库
  8. librdkafka自动源码编译
  9. Filter过滤器详解
  10. Spire.Office for .NET 7.4.10 is released
  11. 关于ttime的序列化存储及读取的方法
  12. html中绝对定位的父级,【CSS学习笔记】绝对定位的父类参照物的确定
  13. Arno,第一个NFV开源平台
  14. 2021年全球化妆品阴离子表面活性剂行业调研及趋势分析报告
  15. SWF (Simple Workflow Service)简介
  16. 考研英语二计算机词汇,考研英语词汇84分的一些经验
  17. Python爬虫--Selenium模拟用户的键盘鼠标操作
  18. matlab实现数据压缩,【Matlab】Huffman编码如何实现数据压缩
  19. 自动驾驶-自适应卡尔曼滤波AKF
  20. fast文件服务器的迁移,FastDfs数据迁移方案预研

热门文章

  1. 单片机C51复习题(课后习题及答案)
  2. excel处理几十万行数据_EXCEL的重生!处理百万行数据竟如此简单
  3. 升升不息——给电脑升级的人一些建议
  4. Win Server 2012发布!回顾Server发展史
  5. CTR --- NFM论文阅读笔记,及tf2复现
  6. cad黑色背景变成白色_盘点CAD中你可能不知道的实用小技巧
  7. windows打印机服务开启方法
  8. 苹果虚拟home键_苹果手机几个实用小技巧,相见恨晚,快试试你的手机!
  9. 基于STC89C51单片机的温湿度检测系统
  10. java+url+空格转码_Web里URL空格的转换方法