函数来自RTT的AT组件 - at_client.c
例如,数据是 CGREG: 0,1,通过at_resp_parse_line_args_by_kw把1赋予link_stat。
简化从AT响应中提取信息的过程,使得编写与硬件通信的代码更加简洁和易于维护。
这么提数据也太方便了
at_resp_parse_line_args_by_kw函数原型
int at_resp_parse_line_args_by_kw(at_response_t resp, const char *keyword, const char *resp_expr, ...)
{
va_list args;
int resp_args_num = 0;
const char *resp_line_buf = RT_NULL;
RT_ASSERT(resp);
RT_ASSERT(resp_expr);
if ((resp_line_buf = at_resp_get_line_by_kw(resp, keyword)) == RT_NULL)
{
return -1;
}
va_start(args, resp_expr);
resp_args_num = vsscanf(resp_line_buf, resp_expr, args);
va_end(args);
return resp_args_num;
}
const char *at_resp_get_line_by_kw(at_response_t resp, const char *keyword)
{
char *resp_buf = resp->buf;
rt_size_t line_num = 1;
RT_ASSERT(resp);
RT_ASSERT(keyword);
for (line_num = 1; line_num <= resp->line_counts; line_num++)
{
if (strstr(resp_buf, keyword))
{
return resp_buf;
}
resp_buf += strlen(resp_buf) + 1;
}
return RT_NULL;
}
通义灵码
该函数用于在AT命令的响应中,根据关键字(keyword)获取响应行,并通过可变参数列表(resp_expr,
…)解析该响应行。具体步骤如下:首先,检查传入的响应对象(resp)和响应格式字符串(resp_expr)是否为空,如果为空则触发断言失败。
然后,调用at_resp_get_line_by_kw函数,传入resp和keyword,获取与关键字匹配的响应行。如果未找到匹配的响应行,则返回-1。
使用va_start宏初始化可变参数列表args,以便解析响应行。
调用vsscanf函数,传入匹配的响应行和可变参数列表args,按照响应格式字符串(resp_expr)解析响应行,并将解析得到的参数存储在args中。
使用va_end宏清理可变参数列表args。 返回解析得到的参数数量resp_args_num。
在C语言中,%*d是一种特殊的格式说明符,用于scanf家族的函数中,包括sscanf和fscanf等。它主要用于读取数据但不存储这些数据,即“忽略”这些数据。下面详细解释一下它的用途和工作原理。
%*d 的含义
%*d 中的星号 * 表示忽略接下来读取的数据。
d 表示读取一个十进制整数。
工作原理
当你使用%*d时,它会告诉scanf家族的函数读取一个整数,但是不会将这个整数存储到任何变量中。换句话说,它只是用来“跳过”这部分数据。
示例
假设我们有一个字符串 “123,456”,我们想要读取逗号后面的数字456,但是忽略前面的数字123。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "123,456";
int num;
// 使用 sscanf 解析字符串
if (sscanf(str, "%*d,%d", &num) == 1) {
printf("The number is: %d\n", num);
} else {
printf("Failed to parse the number.\n");
}
return 0;
}