前言
雅特力AT32WB415是一颗集成了蓝牙模组的MCU,支持蓝牙5.0,包括支持拓展数据包,在保证数据传输效率的同时,又能满足对算法和外设资源有要求的应用,雅特力官网有支持AT指令同时也可支持大数据传输的sample code ,作为一份纯粹的参考代码还是有意义的。
雅特力官网下载连接 :
下面将介绍怎么新增自定义的AT指令,以及怎么获取蓝牙MAC地址
示例教程
1、在用户AT指令定义的枚举
at_cmd_tag 中新增一条指令名称,名称可自定义,例如博主使用的
AT_RESULT_BLE_MAC
enum at_cmd_tag
{
AT_RESULT_AT, // 0
AT_RESULT_BAUD1,
AT_RESULT_BAUD2,
AT_RESULT_BAUD3,
……
AT_RESULT_TPMODE0,
AT_RESULT_TPMODE1,
AT_RESULT_BLE_MAC,
AT_RESULT_MAX,
};
2、然后在AT指令集的结构体
at_prefix_req 中编辑新增的指令对应的指令内容, 例如博主使用的 “
AT+BLEMAC
\r\n”
static const at_prefix_t at_prefix_req[] = {
DECLARE_PREFIX("AT\r\n", AT_RESULT_AT),
DECLARE_PREFIX("AT+BAUDS1\r\n", AT_RESULT_BAUDS1),
DECLARE_PREFIX("AT+BAUDS2\r\n", AT_RESULT_BAUDS2),
DECLARE_PREFIX("AT+BAUDS3\r\n", AT_RESULT_BAUDS3),
……
DECLARE_PREFIX("AT+TPMODE0\r\n", AT_RESULT_TPMODE0),
DECLARE_PREFIX("AT+TPMODE1\r\n", AT_RESULT_TPMODE1),
DECLARE_PREFIX("AT+BLEMAC\r\n", AT_RESULT_BLE_MAC),
};
3、在 app.c 中添加头文件 “
#include
"co_utils.h"”,因为无论是软件MAC或flash中的MAC,最终MAC地址是会缓存在
co_default_bdaddr 中,
co_default_bdaddr 的外部定义是放在
"co_utils.h" 中。
4、
在AT指令处理函数
app_user_entry
中新增
AT_RESULT_BLE_MAC
的处理代码,将MAC复制到临时数组并通过串口回复给 MCU
case AT_RESULT_BLE_MAC:
cpu_delay(15);
char buffer_A[6] = {0};
strncpy(buffer_A, (char *)&co_default_bdaddr.addr, 6);
UART_SEND_DATA("%s\r\n", buffer_A);
break;
5、番外:
修改蓝牙名称的指令无法生效,增加广播关闭和打开的处理。
if (ke_state_get(TASK_APP) == APPM_ADVERTISING)
{
appm_stop_advertising();
}
case AT_RESULT_NAME:
case AT_RESULT_NAMES:
cpu_delay(15);
memset(Sram_Device_name, 0, 20);
memcpy(APP_DFLT_DEVICE_NAME, AT_cmd_buf + prefix_cmd->prefix_len, (AT_cmd_len - prefix_cmd->prefix_len));
appm_set_dev_name(APP_DFLT_DEVICE_NAME, (AT_cmd_len - prefix_cmd->prefix_len));
AT_cmd_len = 0;
if (prefix_cmd->code == AT_RESULT_NAME)
{
save_parameter_to_BK3432_USED_FLASH_AREA(TAG_NAME, (uint8_t *)APP_DFLT_DEVICE_NAME);
}
{
char buffer_A[64] = {0};
#ifdef used_BK3432_MCU
UART_SEND_DATA("@");
#endif
UART_SEND_DATA("%s", get_at_rsp(rsp_code));
strncpy(buffer_A, (char *)(AT_cmd_buf + prefix_cmd->prefix_len), (without_prefix_len - 2));
UART_SEND_DATA("%s\r\n", buffer_A);
}
if (ke_state_get(TASK_APP) == APPM_ADVERTISING)
{
appm_stop_advertising();
}
UART_PRINTF("name : %s\r\n",APP_DFLT_DEVICE_NAME);
break;
结语
欢迎大家指正讨论。