打印
[技术问答]

使用 sscanf 提取AT命令返回结果中的有效数据

[复制链接]
702|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzmm|  楼主 | 2023-4-26 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. sscanf函数 sscanf是C标准库函数,用于从字符串中读取格式化输入。 头文件: #include <stdio.h>函数原型如下: int sscanf(const char *s, const char *format, ...);函数返回值:返回成功读取的数量。 2. 使用实例 …

1. sscanf函数
sscanf是C标准库函数,用于从字符串中读取格式化输入。

头文件:

#include <stdio.h>
函数原型如下:

int sscanf(const char *s, const char *format, ...);
函数返回值:返回成功读取的数量。

2. 使用实例
AT指令参考文章:

移远 EC200S 模组(4G Cat.1 通信模组)AT指令测试 TCP/UDP 通信过程
提取信号强度
AT命令返回结果为:

+CSQ: 17,0

OK
先使用strstr找到标志字符:

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

if (!str) {
        return -1;
}
接着使用sscanf提取数值类型:

ret = sscanf(str, "+CSQ:%d,%d", &rssi, &ber);
if (ret != 2) {
        return -1;
}
提取基站信息
AT命令返回结果为:

+CREG: 2,0,"252A","6DD2104",7
OK
使用sscanf提取固定长度字符:

sscanf(buffer, "+CREG:%d,%d,\"%4s\",\"%7s\"", &n, &stat, lac_buf, ci_buf);
提取IP地址
AT命令返回结果为:

+CIFSR:STAIP,"10.89.100.53"
+CIFSR:STAMAC,"dc:29:19:bb:d7:d3"
OK
使用sscanf提取数值类型:

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命令返回结果为:

+CIFSR:STAIP,"10.89.100.53"
+CIFSR:STAMAC,"dc:29:19:bb:d7:d3"
OK
使用sscanf提取十六进制数值类型:

sscanf(str + strlen("STAMAC,"), "\"%2x:%2x:%2x:%2x:%2x:%2x\"", &seg1, &seg2, &seg3, &seg4,&seg5,&seg6);
正则表达式提取不定长字符
AT命令返回结果为:

+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+正则表达式提取ssid、mac、rssi:

sscanf(str+strlen("+CWLAP:"), "(%d,\"%[^\"]\",%d,\"%[^\"]\",", &ecn, ssid, &rssi, mac);
读取之后,将str指针移动到该行结束,进行下一轮的查找:

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


使用特权

评论回复

相关帖子

沙发
usysm| | 2023-5-5 22:03 | 只看该作者
sscanf(temp,"%f",&a);这句话是什么意思?

使用特权

评论回复
板凳
alvpeg| | 2023-5-5 22:17 | 只看该作者
单片机里面怎么替换字符串?              

使用特权

评论回复
地板
claretttt| | 2023-5-5 22:26 | 只看该作者
使用sscanf函数需要保证待读取的字符串格式正确,并且提供的格式字符串与待读取数据类型一致。

使用特权

评论回复
5
loutin| | 2023-5-5 22:39 | 只看该作者
sscanf与scanf类似,都是用于输入的

使用特权

评论回复
6
phoenixwhite| | 2023-5-5 22:59 | 只看该作者
单片机通常内存较小,因此在使用sscanf函数时需要避免内存溢出等问题。

使用特权

评论回复
7
kkzz| | 2023-5-6 00:04 | 只看该作者
C语言编程如何提高实时性              

使用特权

评论回复
8
burgessmaggie| | 2023-5-6 00:34 | 只看该作者
sscanf语句的第一个参数是需要读取的字符串,后续参数为格式字符串和对应的变量地址。

使用特权

评论回复
9
jkl21| | 2023-5-7 16:03 | 只看该作者
sscanf相当于格式输入,能够处理任何特殊格式的输入。

使用特权

评论回复
10
mattlincoln| | 2023-5-7 16:45 | 只看该作者
根据AT指令的格式和参数类型,编写相应的格式字符串,并提供对应的变量地址。

使用特权

评论回复
11
rosemoore| | 2023-5-7 17:00 | 只看该作者
单片机中的sscanf函数与标准C库中的sscanf函数基本相同,用于从一个字符串中读取指定格式的数据,并将其存储到对应的变量中。

使用特权

评论回复
12
maudlu| | 2023-5-7 17:23 | 只看该作者
在单片机中,sscanf函数通常包含在stdio.h头文件中。

使用特权

评论回复
13
loutin| | 2023-5-7 17:32 | 只看该作者
单片机串口可以用printf发送数据吗?

使用特权

评论回复
14
tpgf| | 2023-6-3 17:37 | 只看该作者
sscanf的作用:从一个字符串中读进于指定格式相符的数据。利用它可以从字符串中取出整数、浮点数和字符串。

使用特权

评论回复
15
nawu| | 2023-6-3 18:00 | 只看该作者
sscanf和scanf的区别:scanf是以键盘作为输入源,sscanf是以字符串作为输入源。

使用特权

评论回复
16
aoyi| | 2023-6-5 10:03 | 只看该作者
sscanf()会将参数str的字符串根据参数format字符串来转换格式并格式化数据。转换后的结果存于对应的参数内。

使用特权

评论回复
17
zljiu| | 2023-6-5 10:42 | 只看该作者
%*d和%*s加了(*)表示跳过此数据不读入(也就是不把此数据读入参数中)

使用特权

评论回复
18
gwsan| | 2023-6-5 11:29 | 只看该作者
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

使用特权

评论回复
19
tfqi| | 2023-6-5 11:51 | 只看该作者
sscanf(str,"%d%d%s", &i,&i2, &s);    如果三个变成都读入成功会返回3。    如果只读入了第一个整数到i则会返回1。证明无法从str读入第二个整数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

386

主题

8575

帖子

11

粉丝