[好记性不如烂笔头]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了。

相关推荐
波力海苔夹心脆675几秒前
C# StringBuilder 详解:字符串拼接为什么总说要用它?
开发语言·笔记·c#·.net·字符串·stringbuilder·入门教程
weixin_448119942 分钟前
Datawhale DeepSeek Harness 技术入门与架构原理 笔记3
笔记·架构
果壳science11 分钟前
关于光子、量子猜想
笔记·科技·学习·创业创新·学习方法
辛迪聊物业数字化14 分钟前
中小物业SaaS系统架构设计:从收费、巡检到IoT对接的落地实践
物联网·系统架构
愤怒火龙果27 分钟前
蓝队笔记整理01 C2 远控与 Webshell 流量特征
笔记·网络安全
丑梨数据1 小时前
法律合同知识库怎么搭:从图片压缩到私有化 RAG 的工程笔记
开发语言·笔记·c#
Yiran_G1 小时前
ZigBee通信正常,数据却是错的?嵌入式开发中的数据链路排查
网络·嵌入式硬件·物联网·智能家居
江屿风1 小时前
【Plain Language Large Model】【大语言模型底层原理全解析:从Token生成到智能体演进】流食般投喂
人工智能·笔记·语言模型·llm·json·token·聊天模板
honsor1 小时前
ModbusTCP、SNMP、HTTP 怎么选?以太网温湿度变送器协议选型实战
网络·物联网·网络协议·tcp/ip·http
启博网络1 小时前
智慧档案库房工业组网:MR-1280 边缘大脑,实现温湿度、漏水、防火防盗设备智能联动教程
运维·网络·物联网·网络协议·网络安全·信息与通信·sdwan