我正在尝试从Wi-Fi模块解析mac地址,但是遇到了一些麻烦。
当我调用wifi_get_mac()
时,它在解析状态下进入on_get_mac_result_line
并在sscanf
之后获得mac地址,但是回到{{ 1}},mac只是随机的东西。
wifi_get_mac
我知道这样做可以得到rssi
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;
}
答案 0 :(得分:3)
char mac[length];
对于on_get_mac_result_line
函数而言是本地的。不应尝试在该功能之外进行访问。
您必须将整个char
数组复制到data
目标中,以使结果可用于调用函数(wifi_get_mac
)。例如。通过使用strncpy
:
strncpy((char*) data, mac, 17);
答案 1 :(得分:2)
该行:
*(char*) data = mac;
试图将char*
分配给char
-在GCC中会产生以下警告:
warning: assignment makes integer from pointer without a cast [-Wint-conversion]
您应该有类似的东西,并且永远不要忽略警告。
这里您需要做的是将mac
中生成的字符串复制到调用方data
提供的缓冲区中:
static void on_get_mac_result_line( void* data, const char* line, int length )
{
if( wifi_state != STATE_IDLE )
{
char mac[length] ;
if( sscanf_s( line, "%17s", mac, length ) == 1 )
{
strcpy( data, mac) ;
}
}
}
您还应该采取措施确保length
足以防止超支,例如,您可以检查length
至少为18,或者像我一样使用sscanf_s
以上。
请注意,原始实现中的p
未使用,没有任何用途。