You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MXChip按键触发Azure IoT信号发送及跨文件调用set_led_state问题

解决MXChip AZ3166按键回调调用Azure客户端函数及发送IoT信号的问题

一、解决button_a_callback调用set_led_state的问题

你的核心障碍是set_led_state被声明为static,仅能在nx_client.c内部访问,且board_init.c缺少该函数的声明。按以下步骤修改:

1. 修改nx_client.c中的set_led_state函数

去掉static修饰符,让函数具备跨文件访问权限:

void set_led_state(bool level)
{
    if (level)
    {
        printf("	LED is turned ON\r\n");
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    }
    else
    {
        printf("	LED is turned OFF\r\n");
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    }
}

2. 添加头文件声明

创建或修改nx_client.h,添加函数的外部声明,确保board_init.c能识别该函数:

#ifndef NX_CLIENT_H
#define NX_CLIENT_H

#include <stdbool.h>

// 声明LED状态设置函数
void set_led_state(bool level);

#endif /* NX_CLIENT_H */

3. 在board_init.c中引入头文件

在board_init.c顶部添加头文件引用:

#include "nx_client.h"

4. 在按键回调中调用函数

修改button_a_callback,在按键按下逻辑中加入调用:

weak void button_a_callback()
{
    WIFI_LED_ON();
    AZURE_LED_ON();
    USER_LED_ON();
    if (BUTTON_A_IS_PRESSED)
    {
        val += 32;
        if (val > 2047)
            val = 2047;
        RGB_LED_SET_R(val);
        RGB_LED_SET_G(val);
        RGB_LED_SET_B(val);
        
        // 调用set_led_state打开LED
        set_led_state(true);
    }
}

二、实现按键按下向Azure IoT发送信号

基于Azure IoT SDK示例,补充消息发送逻辑:

1. 在nx_client.h中添加发送函数声明

// 在nx_client.h中新增
void send_azure_button_signal(void);

2. 在nx_client.c中实现消息发送函数

基于Azure IoT Hub客户端API实现(需确保已完成IoT设备客户端deviceClient的初始化):

#include "azure_iot_hub_client.h"

void send_azure_button_signal(void)
{
    // 创建包含按键状态的JSON消息
    IOTHUB_MESSAGE_HANDLE msg_handle = IoTHubMessage_CreateFromString("{\"event\": \"button_a_pressed\"}");
    if (msg_handle == NULL)
    {
        printf("Failed to create IoT message\r\n");
        return;
    }

    // 异步发送消息到Azure IoT Hub
    IOTHUB_CLIENT_RESULT send_result = IoTHubDeviceClient_SendEventAsync(deviceClient, msg_handle, NULL, NULL);
    if (send_result != IOTHUB_CLIENT_OK)
    {
        printf("Send message failed, error code: %d\r\n", send_result);
    }
    else
    {
        printf("Button signal sent to Azure IoT Hub\r\n");
    }

    // 释放消息句柄避免内存泄漏
    IoTHubMessage_Destroy(msg_handle);
}

3. 在按键回调中调用发送函数

修改button_a_callback,加入信号发送逻辑:

weak void button_a_callback()
{
    WIFI_LED_ON();
    AZURE_LED_ON();
    USER_LED_ON();
    if (BUTTON_A_IS_PRESSED)
    {
        val += 32;
        if (val > 2047)
            val = 2047;
        RGB_LED_SET_R(val);
        RGB_LED_SET_G(val);
        RGB_LED_SET_B(val);
        
        set_led_state(true);
        // 向Azure IoT发送按键触发信号
        send_azure_button_signal();
    }
}

三、编译注意事项

确保nx_client.c已被添加到项目编译列表中,避免链接时出现未定义符号的错误。

内容的提问来源于stack exchange,提问作者Sergio Solorzano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:50:31