函数来自RTT的AT组件 - at_client.c
RTT-AT命令
例如,数据是 CGREG: 0,1,通过at_resp_parse_line_args_by_kw把1赋予link_stat。
at_resp_parse_line_args_by_kw![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d2f19b4161a845f3a42e780334f93427.png)
at_resp_parse_line_args
at_resp_parse_line_args(resp, 1,"IP=%s", ip);
at_resp_parse_line_args(resp, 2,"MAC=%s", mac);
简化从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;
}