ASC格式的协议数据解析-ParseByKeyworld(resp, “+CGPADDR:“, “+CGPADDR: %*d,%s“, ipaddr)

函数来自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在这里插入图片描述

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值