CRC16/ModBusチェックとC言語実装方法

目次

1. CRC16/Modbus チェックサムとは何ですか

2. CRC16/Modbus検証の計算手順

3. CRC16/Modbus検証のC言語実装


1. CRC16/Modbus チェックサムとは何ですか

        CRC16/Modbus チェックは、デバイス通信中にデータ フレームの整合性を検証できるため、誤ったデータを回避できます。主にModbus通信プロトコルなどで広く使われており、同様の検証方法はサム検証など多数ありますが、ここでは主にCRC16検証について説明します。

2. CRC16/Modbus検証の計算手順

        CRC16 チェックの計算手順は次のとおりです。

        - 16 ビット レジスタに 0xFFFF の値をプリセットします。これを CRC レジスタと呼びます。
        ・データを各ビットずつ取り出し、CRCレジスタの下位8ビットとXOR演算を行い、その結果をCRCレジスタに代入します。
                - CRC レジスタの値を右に 1 ビットシフトします。
                - シフトされたビットを判断し、0 の場合は次のバイトに進みます。
                - シフトアウトされたビットが 1 の場合、CRC レジスタと 0xA001 の XOR を計算し、結果を CRC レジスタに割り当てます。
                - 右シフトが 8 回、つまり 1 バイトが処理されるまで、上記の手順を繰り返します。
                - ステップ 2 を繰り返して、すべてのバイトを処理します。
        - CRC レジスタの上位バイトと下位バイトを交換して、最終チェック コードを取得します。

3. CRC16/Modbus検証のC言語実装

       CRC16/Modbus検証のC言語実装方法は、ルックアップテーブル方式と計算方式に分かれます。計算方法は基本公式の原則に基づいており、必要なときに書き出すことができるため、最初に推奨されます。この記事ではアルゴリズム コードも提供します。


uint8 reply[]={0xfe,0x01,0x04,0x00,0x00,0x01,0x00,0x4e,0xf5};
void crc()
{
    int cs = 0xffff;
    for (int i = 0; i < 7; i++)
    {
        cs ^= reply[i];
        for (int j = 0; j < 8; j++)
        {
            if (cs & 1 == 1)
            {
                cs >>= 1;
                cs ^= 0xa001;
            }
            else
            {
                cs >>= 1;
            }
        }
    }
    reply[7] = cs & 0xff; // 校验码的低字节
    reply[8] = (cs & 0xff00) >> 8; // 校验码的高字节
};

おすすめ

転載: blog.csdn.net/qq_39724355/article/details/130957487