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

相关推荐
遇到困难睡大觉哈哈6 分钟前
HarmonyOS —— Remote Communication Kit 定制数据传输(TransferConfiguration)实战笔记
笔记·华为·harmonyos
shcoc23 分钟前
备用 申请acme 申请ssl
网络·网络协议·ssl
EQ-雪梨蛋花汤1 小时前
【Unity笔记】Unity 模型渲染优化:从 Batching 到 GI 设置的完整指南
笔记·unity·游戏引擎
电饭叔1 小时前
如何代码化,两点之间的距离
笔记·python·算法
TL滕1 小时前
从0开始学算法——第十三天(Rabin-Karp 算法练习)
笔记·学习·算法·哈希算法
呱呱巨基1 小时前
C++ 红黑树
数据结构·c++·笔记·学习
TL滕1 小时前
从0开始学算法——第十三天(Rabin-Karp 算法)
笔记·学习·算法
YuSun_WK2 小时前
zerotier-cli listpeers/ listnetworks命令以及IP的理解
网络·网络协议·tcp/ip
断剑zou天涯2 小时前
【算法笔记】二叉树的Morris遍历
数据结构·笔记·算法
永远都不秃头的程序员(互关)2 小时前
人工智能中的深度学习:基础与实战应用
人工智能·笔记·学习