本帖最后由 General-P 于 2022-8-24 22:36 编辑
MCU端产生事件发送指令至蓝牙APP
一、前言
在前面,我们以及测试了蓝牙发送指令控制MCU的状态,测试成功后,我就一直在想能不能编写实现双向通信的功能函数,但是在查阅了资料后我才知道原来官方早就封装好了对应函数,只需要自己编写MCU端的产生事件,就可以通过函数发送对应的指令到蓝牙APP上,十分方便。
二、参考官方例程
打开官方提供的蓝牙工程,找到app_custom.c文件,在42行的位置找到下面这个函数。
static int custom_value_req_ind_handler(ke_msg_id_t const msgid,
struct custom_value_req_ind const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
const uint8_t led_on = 1, led_off = 0;
// Initialize length
uint8_t len = 0;
// Pointer to the data
uint8_t *data = NULL;
at_rsp_content* rsp_content;
// Check requested value
if(uart_tp_mode_flag == false)
{
switch (param->value)
{
case CUSTOM_REMOTE_IO_STATUS:
{
// AT command
UART_SEND_DATA(AT_CMD_IO_GET);
// Wait for response
rsp_content = at_wait_for_rsp();
// Set information
len = APP_CUSTOM_REMOTE_IO_LEN;
if(rsp_content->data[4] == 0x31)
{
data = (uint8_t *)led_off;
}
else
{
data = (uint8_t *)led_on;
}
} break;
default:
ASSERT_ERR(0);
break;
}
}
// Allocate confirmation to send the value
struct custom_value_cfm *cfm_value = KE_MSG_ALLOC_DYN(CUSTOM_VALUE_CFM,
src_id, dest_id,
custom_value_cfm,
len);
// Set parameters
cfm_value->value = param->value;
cfm_value->length = len;
if (len)
{
// Copy data
memcpy(&cfm_value->data[0], data, len);
}
// Send message
ke_msg_send(cfm_value);
return (KE_MSG_CONSUMED);
}
其中这段代码是控制发送的核心
if(rsp_content->data[4] == 0x31)
{
data = (uint8_t *)led_off;
}
else
{
data = (uint8_t *)led_on;
}
通过接收MCU端产生的相应事件指令即可向APP方发送对应的指令。
三、实验效果
发送 02指令后,按下按键,开发板上的LED3点亮,点击蓝牙 APP中的READ AGAIN就可以查看到WB415发送来的LED状态消息啦。