前言
雅特力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, // 0AT_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_MCUUART_SEND_DATA("@");
#endifUART_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;
结语
欢迎大家指正讨论。