This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/CC1350:CRC 解密 C/C++ Java 代码实现、用于验证数据包是否有效且未损坏

Guru**** 2537650 points
Other Parts Discussed in Thread: CC1350

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/922886/ccs-cc1350-crc-decryption-c-c-java-code-implementation-for-validating-if-the-packet-is-valid-and-not-corrupted

器件型号:CC1350

工具/软件:Code Composer Studio

大家好!

我成功地接收了传输的数据包,作为此前导码|SyncWord|DataPacket|CRC,实际上我正在接收称为 rxBuffer[]的数组中的传输数据包,该数据包的整个传输数据包从前导码一直到 CRC。

我尝试在 C/C++ Java 中执行代码,检查接收到的 CRC 并验证我的数据包是否损坏!

为了便于理解我的问题,假设我有一个称为 rxBuffer[]=[0101010101111111111111000000CRC]的数组-在这种情况下,我的 rxBuffer 只有一个数据包用于简化,

为了验证数据包是否损坏、我应该执行什么函数?! 感谢任何帮助。

请尽可能用实际示例详细说明您的答案、以解释您的建议函数的作用、以便理解它、而不是被欺骗。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我谈论的是 CC1350 Launchpad、而不是 cc1311、因此请注意!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这意味着您不再像在本主题中使用的那样使用 IQ 样本:

    上一个线程包含用于计算 CRC 的函数。

    此外、从前面的主题中、我有一种印象、即您并未完全描述您所做的工作。 您能否更详细地描述您为什么要按照自己的方式实施系统? 这样可以更轻松地回答您的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好,我正在接收数据包并解密,这意味着我要检查接收到的数据包是否有效,所以我想知道 cc1350的格式类型,以便计算 CRC。 我想通过 CRC 知道接收到的数据包是否有效... 那么,我有接收到的数据包的 CRC,我知道它,我的问题是如何通过 CRC 来验证数据包是否有效?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请回答我提到的主题中的问题。 此 http://dev.ti.com/tirex/content/simplelink_cc13x0_sdk_4_10_01_01/docs/proprietary-rf/proprietary-rf-users-guide/proprietary-rf/packet-format.html#crc-calculation 提供 了有关所使用的 Polynom 以及如何在代码中计算该值的信息。

    如果这不包括您想要了解的内容、请详细说明您需要其他内容的原因以及我们建议的内容不起作用的原因。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好;

    这还不够!

    我将再次解释,我将数据包保存在二进制位中,我将其保存在称为 rxbuffer []的数组中,因此假设我将接收到的数据包保存在 rxbuffer []中。

    rxbuffer=[1000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010

    那么,现在我想验证这个数据包是否有效... 如何执行/实现一个函数来验证该接收到的数据包、该数据包保存在 rcbuffer 中作为输入(rxbuffer 是一个包含接收到的数据包的数组、它作为我的函数的输入来验证该接收到的数据包是否有效)  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    同样:为了能够使用 CRC、CRC 在 TX 端计算并附加到数据包中。 这意味着您在空中发送了[前导码][SYNC][PAYLOAD][CRC]。 在接收端、您计算[有效载荷]上的 CRC 并与接收到的 CRC 进行比较。

    您需要知道如何在 TX 端计算 CRC。 如果 CC13xx 在 TX 侧、您知道如何根据我上一篇文章中的链接计算该值。  

    然后、您可以使用相同的函数计算接收到的 rxBuffer 上的 CRC。

    如果这不包括您想要知道的内容、请详细说明。 请不要只复制/粘贴您到目前为止所写的内容。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这正是我的问题:如何计算有效载荷上的 CRC、以便将其与接收到的 CRC 进行比较? 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在互联网上读过如何计算 CRC,它们有很多类型,它可能是 XOR 与数据. 但不确定这取决于 CRC 实现的类型。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在两周内介绍了如何计算接收到的数据包 rxbuffer=[10000000000010101010101010101010101010101010101010101010101010101001010CRC]上的 CRC、但未成功!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否曾尝试 过 http://dev.ti.com/tirex/content/simplelink_cc13x0_sdk_4_10_01_01/docs/proprietary-rf/proprietary-rf-users-guide/proprietary-rf/packet-format.html#crc-calculation 中提供的函数 、如果是、会出现什么失败?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    给定的函数是 txbuffer,其值与我的情况类似,是不是二进制的!

    在我的例子中,我有 rxbuffer=[0101010100000000000000000000000011110000000000110];它具有接收到的数据包的二进制值。

    这对我来说不起作用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    函数对字节进行操作、我假设您在将数据传递给函数之前已将数据转换为字节?

    您写的是"它不起作用"。 请展示您如何计算 CRC。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #define CRC16_Poly 0x8005
    UINT16 CulcCRC (字节 crcData、UINT16 crcReg){
    uint8 i;
    对于(i = 0;i < 8;i++){
    if (((crcReg & 0x8000)>> 8)^(crcData & 0x80)){
    crcReg =(crcReg << 1)^ CRC16_Poly;
    } 否则{
    crcReg =(crcReg << 1);
    }
    crcData <<= 1;
    }
    返回 crcReg;
    }-->/ cCalcCRC
    
    
    /-------------------------------------------------------
    //用法
    
    示例#define CRC_INIT 0xFFFF
    UINT8 rxBuffer ={10000000000011111111111111111111101100000000011100000001111010101110110000101};
    UINT16校验和;
    UINT8 I;
    
    校验和= CRC_INIT;// CRC 计算的初始值
    
    (i = 0;i < eof (rxcrc+
    );crc+)校验和= crc+(i +);crc+(crc+)
    

    如果它能正常工作,那么我不会问:)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在将缓冲区传递给函数之前、您似乎没有将缓冲区从二进制转换为字节?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    转换成字节? 您是指整数? 请将您的意思详细解释为字节

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是说我的流位中的每个字节都要将其转换为整数?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有什么帮助吗?! 谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否了解过以下内容:  

    https://stackoverflow.com/questions/13667746/converting-from-8-bits-to-1-byte

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,它的用户是字符串8位.. 但我的问题是我的字符串(rxbuffer)大于8位!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果有一个具有 n 个位的缓冲区、则必须将其转换为包含 n/8个字节的缓冲区。 因此、缓冲区中的每8个位都会转换为一个字节。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此,为了理解100%,我将有另一个数组, 每隔8位就像这样:convertedbuffer={11111101,00001010,010101,00000001,11111111111111}

    然后我将这些数据(每8位数据)转换为整数?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我是说为了将转换后的 rxbuffer 数组输入到我们讨论过的函数、应该是什么样的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我成功地将我的二进制数据 rxbuffe[]转换为字节数据我是要键入 unit8_t  

    现在我有了与 unit8 rxbuffer={5,1,2,3,4,4类似的 rxbuffer={5、1、2、3、4、 5、0、0};

    那么、现在我如何比较接收到的 CRC 与传输的 CRC?

    感谢您的任何解释。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、请提供任何帮助?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否已根据此序列计算出 CRC 并将其与您接收到的 CRC 进行比较?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是我的问题、如何计算 CRC? 我接收到的 CRC 是可以的、我知道它、但是我传输数据包的 CRC 是如何计算它的?

    为了在它们之间进行比较,我想知道基于这个序列的 CRC。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有什么帮助吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在接收到的数据包中有 CRC、我知道它.. 现在、我如何将它与我的其他 CRC 进行比较、我不知道其他 CRC 有什么帮助吗?! 非常感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    @

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mohammed、  

    首先、您能否提供接收到的非二进制缓冲器? 据我所知、您的"二进制"表示实际上不是预期的 N 个字节长(8位/字节)。

    假设您具有完整的有效负载(例如、使用 SmartRF Studio 捕获数据包或其他内容)、则您可能会使用您之前建议的 CRC 功能。 就初始值和多项式而言、您的基本假设似乎是正确的。  

    我建议您尝试使用此工具来测试您所需的 CRC 设置:

    http://www.zorc.breitbandkatze.de/crc.html

    您可以在其中输入接收到的有效载荷值、并使用反映输入和输出的方式进行播放。 我将使用默认的最终 XOR 值作为起点。 默认情况下、您应该通过对专有射频进行以下假设来获得正确的 CRC:

    • 长度字段(如果使用)是有效载荷的一部分
    • 初始 XOR 为 FFFF
    • Polynom 为8005
    • 最终 XOR 为0
    • 不反映输入/输出

    例如、如果我使用 SmartRF Studio 使用"可变长度"设置发送(十六进制) 01 02 03 04 05 06 07 08 09 00、它将发送0A  01 02 03 04 05 06 07 08 09 00、其中0A 是长度字段。 TX 端将获取有效载荷+长度并根据此值计算 CRC、换句话说、CRC 为0A 01 02 03 04 05 06 07 08 09 00。  

    为此、接收到的 CRC 为7B 8F (通过读取附加值)、这与相关工具计算得出的值相同。 当您使其正常工作时、您可以返回尝试您的 C 代码示例。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答、但仍然不太清楚!

    假设我通过 smartRFstudio 发送一个包含有效载荷(包括长度) FFFFFFFFFFFFFFFF 的数据包,一旦收到该数据包,我就会看到接收到的数据包的 CRC。 那么、为了计算正确的 CRC、我现在应该怎么做? 或者如何知道我的正确 CRC 以便能够将其与我收到的数据包 CRC 进行比较? 。 如果你以我的例子为例, 在解释性解释中解释一下,那将是感激的。  

    非常感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mohammed、

    这是一个基本的 CRC-16例程、有大量的在线信息(包括上面发布的链接)可以帮助您计算它、您甚至链接了一个代码示例、该示例应该完全能够为您执行运算。

    如何验证 CRC?  

    *在 CCS (或 IAR)中打开 rfPacketRX 示例

    *编辑 smartrf_settings.c:rf_cmdPropRx、将 bIncludeCrc 设置为1。

    *将代码下载到设备

    *在回调例程中设置断点

    *从 SmartRF Studio 随另一个板发送一个字符串

    *读出调试器中遇到断点时附加的 CRC 有效载荷是什么

    *将其与您自己计算的值进行比较