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
相关产品推荐
相关产品推荐

