Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已搜索Arduino CRC32代码解释_Arduino_Crc_Crc32 - Fatal编程技术网

已搜索Arduino CRC32代码解释

已搜索Arduino CRC32代码解释,arduino,crc,crc32,Arduino,Crc,Crc32,我从Arduino开始,下一个任务是解决如何实现CRC检查的问题。我想我已经找到了一个合适的代码。但只是实现……不,我想学习。我搜索了一些关于CRC的一般信息,并使用youtube视频学习了数学基本原理,这教会了我如何用C语言实现CRC。尤其是读了这篇文章后,我的头脑有点超负荷了,但我想我理解了这个原理 所以,在我满怀希望地说服你们我想学习这些东西之后,下面是一个例子,它给出了对我来说太复杂的Arduino CRC代码片段 有几件小事在我脑海中留下了问号,例如~0L是什么意思,或者为什么在crc

我从Arduino开始,下一个任务是解决如何实现CRC检查的问题。我想我已经找到了一个合适的代码。但只是实现……不,我想学习。我搜索了一些关于CRC的一般信息,并使用youtube视频学习了数学基本原理,这教会了我如何用C语言实现CRC。尤其是读了这篇文章后,我的头脑有点超负荷了,但我想我理解了这个原理

所以,在我满怀希望地说服你们我想学习这些东西之后,下面是一个例子,它给出了对我来说太复杂的Arduino CRC代码片段

有几件小事在我脑海中留下了问号,例如~0L是什么意思,或者为什么在crc字符串函数的while循环中有条件*s,还有很多其他的事情

有没有人能仔细阅读第二个链接中提供的代码,并详细解释它的功能,以便像我这样的普通人也能理解,而只是实现代码

我非常感激

致意

编辑:我将根据评论中的要求发布与第二个链接相关的具体问题

  • 在crc_字符串函数中,变量crc用~0L初始化。我知道~是一个按位运算符,它使0变成1,反之亦然。但它对0L有什么影响?0L到底是什么?NULL的另一个表达式?为什么写得这么抽象?是否有一种更简单的编码方法

  • crc_字符串函数的下一行:while(*s)-->*s在示例中是“HELLO”。但这意味着什么呢?这不总是真的吗?什么时候可以变为false?我知道一些指针的基本知识,但我不懂这个

  • 现在我们深入研究while表达式:crc_update(crc,*s++);-->在“HELLO”的情况下,第二个参数是什么,++在这种情况下做什么?我是说,你怎么把HELLO加1

  • 我想在了解了这一点之后,剩下的问题会变得更加清楚,但我可以继续问一些问题:

  • 现在我们将进入更新函数:我真的不明白整个函数,为什么会有0*4的移位(这不是没用吗?),pgm_read_dword_near的表现如何,为什么会再次有移位,为什么在返回crc后,crc再次出现

  • 在我编辑这篇文章之前的第一个链接中,您可以看到作者正在使用一个表来存储256位的crc。在本教程中,有一个包含16个条目的表。我大致了解了为什么我们使用表,我认为作者只使用了16个条目,因为arduino提供的空间有限。但无论如何,这一切在这里是如何运作的?我真的不明白

  • 希望这在开始时足够具体

    另一个更一般的crc问题:我的意思是,crc的基本思想是将字节消息除以另一个神秘数字,并将剩余部分附加到消息-->crc是剩余部分。但是,当我有2个字节时,例如,我想同时传输两个字符,如“H”和“W”,我该怎么办?那我得去华润。如何将两个crc转换为一个最终crc

    编辑2因为我想回答詹姆斯·鲍曼的答案:

    首先,它太棒了,在我问了一个问题后仅仅一天,代码的所有者就来回答了

    你的指示已经帮了我很大的忙,我试着用第一个字母“H”的例子做一个循环,直到我卡住为止

    我想还会出现一些问题,如果我现在说废话,我希望你也能纠正我:

    2.1。首先,crc用0xFFFFFF初始化

    2.2。“HELLO”就像一个数组。指针在while循环中的作用是取消对该数组的第一个地址的引用,因此它是“H”

    2.3。使用以下参数调用crc_更新:0xFFFFFFFF和“H”。完成后,指针将指向“E”

    2.4。在更新函数tbl_中,idx被初始化为0xFFFFFFFF^0x48(ASCII代码表示“H”)。既然0x48只有一个字节,那么它到底是怎么来的呢?我将0x48转换为二进制,即:0100 1000。然后,在按位运算之后,它是:10110111。对吗?所以tbl_idx现在是10110111

    2.5。然后,pgm搜索功能出现。在文档中,我发现“dword”有点让人困惑:“从程序空间中读取一个双字,地址为16位(接近16位)”,但在表中,都是32位?你能给我解释一下吗

    2.6。我继续这个函数。因此,它在表中搜索:10110111&0x0f,即0000 0111,然后使用crc>>4(0000 1111 1111 1111 1111 1111 1111 1111-正确?),这是:好问题…同样,不同的字节大小。。。如果考虑了最右边的字节,那么结果将是:1111 1000,因此它在表中查找该值,但只有16个条目,而不是248个条目:(

    我想我在这里有一个思维错误,所以我不能继续。如果你能在这里帮助我,那就太好了


    如果您还有一个关于CRC32的简单易懂的文档,我也可以理解,请不要犹豫,与我分享:-)

    我编写了您链接到的代码,因此我将尝试回答您的问题

  • 使用~0升。这是必要的,因为算法使用32位数字,而Arduino的代码默认使用16位数字。“L”后缀告诉编译器该值为“long”,因此它以32位对其进行计算

  • “s”的类型是“指向字符的指针”-这通常被认为是“字符串”,但在一些情况下它们是不同的。特别是,“*s”是s指向的当前字符。最初*s是H,然后是E,L,L,O。最后它指向字符串的末尾,所以*s是零。此时while循环退出

  • 因为“s”是“指向字符的指针”,所以s++表示下一个字符

  • 转移