Visual C# 2010 開發 Modbus CRC 演算

   在 MODBUS 的 RTU 通信協議下,每個傳輸的指令後都要加 2 個 Bytes 的 CRC,CRC的說明如後:

CRC Checksum 算法

  CRC 的 C# SOURCE ,這一段是我在網路上找到的,我把原始碼上加了說明:

 private void GetCRC(byte[] message, ref byte[] CRC) // message : Modbus指令 ; CRC : 2 Byte Checksum
        {
            ushort CRCFull = 0xFFFF; // CRC 的初值設成 0xFFFF
            byte CRCHigh = 0xFF, CRCLow = 0xFF; // CRC 的 High byte 和 Low byte
            char CRCLSB; // CRC Least signficant bit

            for (int i = 0; i < (message.Length) - 2; i++)
            {
                CRCFull = (ushort)(CRCFull ^ message[i]); // exclusive or 

                for (int j = 0; j < 8; j++)
                {
                    CRCLSB = (char)(CRCFull & 0x0001); // 取得 Least signficant bit
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF); // 移去 Least signficant bit,前補0

                    if (CRCLSB == 1) // 如果 Least signficant bit 為 1
                        CRCFull = (ushort)(CRCFull ^ 0xA001); 
                }
            }
            CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF); // CRC high byte 在 後
            CRC[0] = CRCLow = (byte)(CRCFull & 0xFF); // CRC low byte 在前
        }


留言

  1. 兩個地方需要修改
    for (int i = 0; i < (message.Length) - 2; i++)
    改成
    for (int i = 0; i < message.Length; i++)

    0x7FFF改成0xFFFF

    我用下面網址的CRC-16/MODBUS做過驗證
    https://crccalc.com/

    回覆刪除

張貼留言

請多指教

這個網誌中的熱門文章

Arduino 模擬 Modbus Slave

Arduino IDE 1.6.5 + BH1750 + CD74HC4067 多工器

【輕鬆工作家】使用 3D 印表機 製作一台 Arduino CNC GRBL 繪圖機