C語(yǔ)言 | 如何使用 sscanf 提取AT命令返回結(jié)果中的有效數(shù)據(jù)

擊上方“程序員小哈”,選擇“星標(biāo)公眾號(hào)

干貨福利,第一時(shí)間送達(dá)!

1. sscanf函數(shù)

sscanf是C標(biāo)準(zhǔn)庫(kù)函數(shù),用于「從字符串中讀取格式化輸入」

頭文件:

#include <stdio.h>

函數(shù)原型如下:

int sscanf(const char *s, const char *format, ...);

函數(shù)返回值:「返回成功讀取的數(shù)量」

2. 使用實(shí)例

提取信號(hào)強(qiáng)度

AT命令返回結(jié)果為:

+CSQ: 17,0

OK

先使用strstr找到標(biāo)志字符:

str = strstr(buffer, "+CSQ");

if (!str) {
 return -1;
}

接著使用sscanf提取「數(shù)值類型」

ret = sscanf(str, "+CSQ:%d,%d", &rssi, &ber);
if (ret != 2) {
 return -1;
}

提取基站信息

AT命令返回結(jié)果為:

+CREG: 2,0,"252A","6DD2104",7
OK

使用sscanf提取「固定長(zhǎng)度字符」

sscanf(buffer, "+CREG:%d,%d,\"%4s\",\"%7s\"", &n, &stat, lac_buf, ci_buf);

提取IP地址

AT命令返回結(jié)果為:

+CIFSR:STAIP,"10.89.100.53"
+CIFSR:STAMAC,"dc:29:19:bb:d7:d3"
OK

使用sscanf提取數(shù)值類型:

sscanf(str + strlen("STAIP,"), "\"%d.%d.%d.%d\"", &seg1, &seg2, &seg3, &seg4);

另外一種寫法是直接寫到格式化字符串中:

sscanf(str, "STAIP,\"%d.%d.%d.%d\"", &seg1, &seg2, &seg3, &seg4);

提取MAC地址

AT命令返回結(jié)果為:

+CIFSR:STAIP,"10.89.100.53"
+CIFSR:STAMAC,"dc:29:19:bb:d7:d3"
OK

使用sscanf提取十六進(jìn)制數(shù)值類型:

sscanf(str + strlen("STAMAC,"), "\"%2x:%2x:%2x:%2x:%2x:%2x\"", &seg1, &seg2, &seg3, &seg4,&seg5,&seg6);

正則表達(dá)式提取不定長(zhǎng)字符

AT命令返回結(jié)果為:

+CWLAP:(4,"TP-LINK_PocketAP_DFBCD4",-57,"38:83:45:df:bc:d4",6)
+CWLAP:(3,"LSTM",-61,"8c:21:0a:bc:8e:70",13)
+CWLAP:(3,"LabWiFi",-62,"68:3b:78:8f:16:23",1)
+CWLAP:(0,"GuestWiFi",-64,"68:3b:78:8f:16:22",1)

OK 

先找到+CWLAP

strstr(buffer+offset, "+CWLAP:");

使用sscanf+正則表達(dá)式提取ssid、mac、rssi:

sscanf(str+strlen("+CWLAP:"), "(%d,\"%[^\"]\",%d,\"%[^\"]\",", &ecn, ssid, &rssi, mac);

讀取之后,將str指針移動(dòng)到該行結(jié)束,進(jìn)行下一輪的查找:

while (*str++ != '\n') {
     offset++;
}
------------ END ------------

歡迎關(guān)注我的公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


→點(diǎn)關(guān)注,不迷路←

分享 ????  點(diǎn)贊 ????  在看 ?? 

以“三連”行動(dòng)支持優(yōu)質(zhì)內(nèi)容!

“閱讀原文”了解小哈哥的知識(shí)星球,
我們一起成長(zhǎng)