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

相关推荐
newsxun几秒前
从一条国道,到一个时代符号——申晨案例解析:如何打造公路文旅现象级IP「此生必驾318」
网络·网络协议·tcp/ip
日更嵌入式的打工仔7 分钟前
RS-485通讯协议
笔记·嵌入式硬件
数据轨迹00118 分钟前
ICCV MK-UNet:多核深度可分离卷积医学分割
经验分享·笔记·facebook·oneapi·twitter
Bruce_Liuxiaowei24 分钟前
基于抓包分析的组播视频流故障排查与解决
网络·网络协议·wireshark·信号处理
2501_915909061 小时前
设置了 SSL Pinning 与双向 TLS 验证要怎么抓包
网络·网络协议·ios·小程序·uni-app·iphone·ssl
txinyu的博客2 小时前
HTTPS
网络协议·http·https
筱谙2 小时前
BES BLE低功耗蓝牙技术实现分析
服务器·网络·网络协议
玄微云2 小时前
当暖心服务遇见硬核AI:玄微子AI让孕产关怀更有温度
大数据·人工智能·科技·物联网·产康门店
狐573 小时前
2026-01-20-论文阅读-Can-1B-LLM-Surpass-405B-LLM?
论文阅读·笔记
2301_780789663 小时前
2025年UDP洪水攻击防护实战全解析:从T级流量清洗到AI智能防御
服务器·网络·人工智能·网络协议·安全·web安全·udp