[好记性不如烂笔头]RT_Thread http ota升级踩坑笔记(CRC校验不通过)

一、背景

最近在做项目中,需要使用到http的OTA升级,当写完后,一般就要进行一些包的校验,如CRC,然后发现CRC校验不通过。

二、设备软件环境

采用的是底层的AT CLIENT 组件

三、原因分析

1、第一步,当校验不通过时,应该是数据不相同导致的。

第二步,直接将所有接收到的数据打印出来,复制内容,使用在线的DIFF比较工具,进行数据比较,发现原始数据 0d 0a时,打印出的数据则是0d 00,而这个在ASCII中是\r\n的表示。

第三步 通过观察日志,发现,在AT 组件使用底层打印时,数据还是齐全的

c 复制代码
static int at_recv_readline(at_client_t client)
{
    rt_size_t read_len = 0;
    char ch = 0, last_ch = 0;
    rt_bool_t is_full = RT_FALSE;

    rt_memset(client->recv_line_buf, 0x00, client->recv_bufsz);
    client->recv_line_len = 0;

    while (1)
    {
        at_client_getchar(client, &ch, RT_WAITING_FOREVER);

        if (read_len < client->recv_bufsz)
        {
            client->recv_line_buf[read_len++] = ch;
            client->recv_line_len             = read_len;
        }
        else
        {
            is_full = RT_TRUE;
        }

        /* is newline or URC data */
        if ((ch == '\n' && last_ch == '\r') || (client->end_sign != 0 && ch == client->end_sign) || get_urc_obj(client))
        {
            if (is_full)
            {
                LOG_E("read line failed. The line data length is out of buffer size(%d)!", client->recv_bufsz);
                rt_memset(client->recv_line_buf, 0x00, client->recv_bufsz);
                client->recv_line_len = 0;
                return -RT_EFULL;
            }
            break;
        }
        last_ch = ch;
    }

#ifdef AT_PRINT_RAW_CMD
    at_print_raw_cmd("recvline", client->recv_line_buf, read_len);
#endif

    return read_len;
}

这里打印的数据是符合预期的,但是从resp中取出来的数据似乎就变了,故将问题定位到resp的数据拷贝上。

继续看底层发现在static void client_parser(at_client_t client)函数中,有这么一句

c 复制代码
  client->recv_line_buf[client->recv_line_len - 1] = '\0';

此时真相大白,因为这个接收数据是根据\r\n判断是否此行结束,开启新的一行,这句直接将\n改为\0了。

相关推荐
YuMiao7 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
不可能的是1 天前
前端 SSE 流式请求三种实现方案全解析
前端·http
Jony_3 天前
高可用移动网络连接
网络协议
chilix3 天前
Linux 跨网段路由转发配置
网络协议
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
gihigo19985 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
starlaky5 天前
Django入门笔记
笔记·django
勇气要爆发5 天前
吴恩达《LangChain LLM 应用开发精读笔记》1-Introduction_介绍
笔记·langchain·吴恩达
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
勇气要爆发5 天前
吴恩达《LangChain LLM 应用开发精读笔记》2-Models, Prompts and Parsers 模型、提示和解析器
android·笔记·langchain