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

相关推荐
w1wi6 小时前
安卓抓包完全指南(一):从入门到 SSL Pinning 绕过
android·网络协议·ssl
不是山谷.:.7 小时前
前端性能优化全解析:从原理到落地,覆盖全领域与多技术栈
前端·笔记·性能优化·状态模式
dusk_star7 小时前
go语言--笔记--封装、组合(继承)
笔记·golang
不动明王呀7 小时前
almalinux8.10用户添加到root权限笔记
笔记
不是光头 强8 小时前
Java 后端实战进阶:从踩坑到架构的系统化笔记
java·笔记·架构
叶~小兮8 小时前
ELK技术栈全套学习笔记(Elasticsearch+Logstash+Filebeat)
笔记·学习·elk
つ安静与叛逆的小籹人9 小时前
小红书笔记详情API实战总结(技术复盘)
笔记
sheeta19989 小时前
LeetCode 每日一题笔记 日期:2026.05.16 题目:154. 寻找旋转排序数组中的最小值 II
笔记·算法·leetcode
玄米乌龙茶1239 小时前
从 Token 到 API 调用: LLM 实战笔记
笔记
qeen879 小时前
【算法笔记】各种常见排序算法详细解析(下)
c语言·数据结构·c++·笔记·学习·算法·排序算法