首页 > 解决方案 > 使用 void* 更改字符

问题描述

我正在尝试从 Wi-Fi 模块解析 mac 地址,但我遇到了一些麻烦.. 当我调用wifi_get_mac()时,它在解析状态下工作正常,在on_get_mac_result_line之后我得到 mac 地址sscanf,但是当我回到了wifi_get_mac,mac只是随机的..

static void* wifi_process_line_data;
static void (*wifi_process_line_func)(void* data, const char* line, int length);

static void on_get_mac_result_line(void* data, const char* line, int length)
{
    if (wifi_state != STATE_IDLE) {
        char mac[length];
        char *p = mac;
        if (sscanf(line, "%17s", mac) == 1) {
            *(char*) data = mac;
        }
    }
}

char* wifi_get_mac(void){
    static char mac[17];
    char *p = mac;
    wifi_process_line_data = p;
    wifi_process_line_func = on_get_mac_result_line;
    if (wifi_perform_s2w_command("AT+NMAC=?\n") && mac[0] != '\0') {
        return '\0';
    }
    return mac;
}

我知道这可以获取 rssi

static void on_get_rssi_result_line(void* data, const char* line, int length)
{
    if (wifi_state != STATE_IDLE) {
        int rssi;
        if (sscanf(line, "%d", &rssi) == 1) {
            *(int*)data = rssi;
        }
    }
}

int wifi_get_rssi(void)
{
    int rssi = INT_MAX;
    wifi_process_line_data = &rssi;
    wifi_process_line_func = on_get_rssi_result_line;
    if (wifi_perform_s2w_command("AT+WRSSI=?\n") && rssi != INT_MAX) {
        return rssi;
    }
    return INT_MAX;
}

标签: c

解决方案


char mac[length];on_get_mac_result_line函数的局部。不应尝试在该功能之外访问它。

您必须将整个char数组复制到data目标中,以使结果可用于调用函数 ( wifi_get_mac)。例如。通过使用strncpy

strncpy((char*) data, mac, 17);

推荐阅读