シリアル通信などでは、ノイズなどによって正常に送信データを受信できないことがあります。そのため、送られてきたデータを正常に受信できたかどうかを確認する必要があります。受信データが正常かどうかを判断する手法は、パリティチェック、チェックサム、CRCなどがあります(表1参照)
方式 | 機能 | 特長 |
---|---|---|
パリティチェック | ビット列中に含まれる「1」の数が偶数か奇数かを表す符号をデータに付加する手法 | 最も単純なエラー検出方式。 1ビットのエラーしか検出できないが、検証が簡単なため広く使われている。 |
チェックサム | データ列を整数値の列と見なして和を求め、これをある定数で割った余りを検査用データとする手法 | 比較的単純なエラー検出方式。 精度は低いが容易に実装でき、計算コストも低いため、簡易的な誤り検出方式として広く使われている。 |
CRC | 送信データを数値としてみなし、ある決められた数値(生成多項式)で割った余りの値が、送信側と受信側で一致するかどうかでエラー検出する手法 | 上記2つよりも確実性が高く、厳密にエラーチェックしたい場合に用いられる。 |
パリティチェックとは、ビット列中に含まれる「1」の数が偶数か奇数かを表す符号を算出してデータに付加する手法です。最も単純なエラー検出方式で、1ビットのエラーしか検出できませんが、算出や検証が簡単なので、広く使われています。
チェックサムとは、データ列を整数値の列と見なして和を求め、これをある定数で割った余りを検査用データとする手法です。比較的単純なエラー検出方式なので、精度は低いものの、容易に実装でき、計算コストも低いため、簡易な誤り検出方式として広く使われています。
CRCは、送信データを数値としてみなし、ある決められた数値(生成多項式)で割った余りの値が、送信側と受信側で一致するかどうかでエラー検出する手法です。上記2つよりも確実性が高いため、厳密にエラーチェックしたい場合に用いられています。
CRCでは、エラーをチェックする対象のデータを一定のビット数ごとに区切って二進数の値とみなします。そして、あらかじめ送信側と受信側でチェック用の数値を決めておきます。これを生成多項式と呼びます。生成多項式では、チェックしたいデータのビット数よりも短いビット数の値を使います。割り算では、余りは必ず割る数よりも小さい値になるので、割られる数の大きさにかかわらず、必ず一定値よりも小さくなることを利用しています。
送信側は、送信前に送信データを生成多項式で割り算します。すると、商と余りが求められます。この余りの値を送信データに付加して送信します。
受信側は送られてきたデータを、送信側と同じ生成多項式で割ります。この時に求められた余りとデータに付加された余りを比較して、一致していればデータを正常に受信できたと判断します。余りを検証する計算方法は、特に決まっていません。受信データから受信した余りを引き算してから生成多項式で割って、余りが出ないことを確認しても正常に受信したことを検証できます(図2)
チェック対象のデータのビット数には、さまざまな種類があります。例えば、32ビットマイコン*2)であれば32ビットで区切ったり、16ビットマイコンでは16ビットで区切ったりします。ビット数は通信状況や通信規格に依存するため、通信環境の考慮や、通信規格に従う必要があります。
生成多項式がnビットになる場合を「CRC-n」や「nビットCRC」と呼びます。実際には、マイコンのビット数に合わせて8ビットや16ビット、32ビットなどがよく用いられます。実際の数値の長さはn+1ビットとなります。例えば、8ビットCRCであれば9ビットの数値になり、16ビットだと17ビットの数値になります。
一般的に、生成多項式はxのべき乗の加算式で表されます。例えばCRC-8だとx8+x2+x1+x0のようになり、これは8ビットと2ビットと1ビットと0ビットが1になる100000111を意味します。
また、同じビットのCRCでも数値が異なる複数の方式があります。
Copyright © ITmedia, Inc. All Rights Reserved.