Home

Awesome

CRCx

CRC calculation for Arduino and other C++ programs. This library is created to use crc calculation as same method for both Arduino and other C++ propgrams (like openFrameworks and so on). CRCx is based on fast and efficient two great works, and CRCx is just a glue for these two great works.

Usage

One-Time calculation

#include <CRCx.h>

const uint8_t data[] = {'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D'};
const size_t size = sizeof(data);

void setup() {
    Serial.begin(115200);
    delay(2000);

    uint8_t result8 = crcx::crc8(data, size);
    uint16_t result16 = crcx::crc16(data, size);
    uint32_t result32 = crcx::crc32(data, size);

    Serial.print("crc8  = 0x"); Serial.println(result8, HEX);
    Serial.print("crc16 = 0x"); Serial.println(result16, HEX);
    Serial.print("crc32 = 0x"); Serial.println(result32, HEX);
}

// Console Output:
// crc8  = 0x7
// crc16 = 0xB944
// crc32 = 0x87E5865B

Continuous calculation

#include <CRCx.h>

const uint8_t data[11] = {'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D'};
const size_t size = sizeof(data);

void setup() {
    Serial.begin(115200);
    delay(2000);

    // first
    uint8_t result8 = crcx::crc8_update(data, 5);
    uint16_t result16 = crcx::crc16_update(data, 5);
    uint32_t result32 = crcx::crc32_update(data, 5);

    // second
    result8 = crcx::crc8_update(data + 5, 3);
    result16 = crcx::crc16_update(data + 5, 3);
    result32 = crcx::crc32_update(data + 5, 3);

    // third
    result8 = crcx::crc8_update(data + 8, 3);
    result16 = crcx::crc16_update(data + 8, 3);
    result32 = crcx::crc32_update(data + 8, 3);

    Serial.print("crc8  = 0x"); Serial.println(result8, HEX);
    Serial.print("crc16 = 0x"); Serial.println(result16, HEX);
    Serial.print("crc32 = 0x"); Serial.println(result32, HEX);
}

// Output:
// crc8  = 0x7
// crc16 = 0xB944
// crc32 = 0x87E5865B

APIs

inline uint8_t crc8(const uint8_t* data, const size_t size, const Crc8 type = Crc8::SMBUS);
inline uint16_t crc16(const uint8_t* data, const size_t size, const Crc16 type = Crc16::MODBUS);
inline uint32_t crc32(const uint8_t* data, const size_t size, const Crc32 type = Crc32::CRC32);
inline uint8_t crc8_update(const uint8_t* data, const size_t size, const Crc8 type = Crc8::SMBUS);
inline uint16_t crc16_update(const uint8_t* data, const size_t size, const Crc16 type = Crc16::MODBUS);
inline uint32_t crc32_update(const uint8_t* data, const size_t size, const Crc32 type = Crc32::CRC32);

// C++ (not Arduino) Only
inline uint64_t crc64(const uint8_t* data, const size_t size);
inline uint64_t crc64_update(const uint8_t* data, const size_t size);

CRC Options

You can specify how to calculate by setting 3rd argument.

uint32_t result32 = crcx::crc32(data, size, Crc32::POSIX);

Available options and default parameters are shown below.

enum class Crc8 : uint8_t {
    SMBUS, // default
    MAXIM
};

enum class Crc16 : uint8_t {
    CCITT,
    KERMIT,
    MODBUS, // default
    XMODEM,
    X25
};

enum class Crc32 : uint8_t {
    CRC32, // default
    POSIX
};

Use FastCRC or CRCpp directly

Of course, you can use FastCRC or CRCpp directly.

FastCRC

FastCRC32 fastcrc;
uint32_t crc32 = fastcrc.crc32(data, size);

Please refer to FastCRC original page for more information.

CRCpp

NOTE: Following CRCpp options are enabled as default.

#define CRCPP_USE_CPP11
#define CRCPP_USE_NAMESPACE
#define CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS

and you can use as:

uint32_t crc32 = CRCpp::CRC::Calculate(data, size, CRCpp::CRC::CRC_32());

Please refer to CRCpp original page for more information.

License

MIT