Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Arduino用の超速CRCチェッカー

CRC(Cyclic Redundancy Check / 巡回冗長符号)は、自前でパケットを作るなら必須の項目です。
これがないと、ダメパケットも受け取ってデータがゴミだらけになったりします。
非力な軽量無線やシリアル線直付けな構成なんかだと、特に。

実際のところ

ただ一々仕様みて実装するのは
Arduino用の超速CRCチェッカーがありました
……いままで泥臭く自力で作っていた僕は一体……??

使い方は、こんな感じ。

/*
  FastCRC-Example
  (c) Frank Boesing 2014
*/

#include <FastCRC.h>

FastCRC32 CRC32;

uint8_t buf[9] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};

void setup() {

  delay(1500);
  Serial.begin(115200);

  Serial.println("CRC Example");
  Serial.println();

  Serial.print("CRC32 of \"");

  for (unsigned int i = 0; i < sizeof(buf); i++) {
    Serial.print((char) buf[i]);
  }

  Serial.print("\" is: 0x");
  Serial.println( CRC32.crc32(buf, sizeof(buf)), HEX );

}

種類

CRC7、MODBUS、XMODEM用といったよくあるパターンもそのまんま書いてくれているので
態々地獄実装をしなくてすみます。

たとえばPOSIX準拠32bitCRCは
CKSUM, CRC-32/POSIX (poly=0x04c11db7 init=0x00000000 refin=false refout=false xorout=0xffffffff check=0x765e7680)
だそうです。

興味がある方は実装を読んでみても面白いでしょう。