Modbus rtu CRC碼計算方式

private void button1_Click(object sender, EventArgs e)
        {
            string hex = textBox1.Text.Trim();
            if (hex.Length > 1)
            {
                byte [] inputByteArray = new byte[hex.Length / 2];
                for (var x = 0; x < inputByteArray.Length; x++)
                {

                    string s = hex.Substring(x * 2, 2);
                    uint s4 = Convert.ToUInt32(s, 16);
                    inputByteArray[x] = Convert.ToByte((int)s4);
                }
                string x1=crc16_modbus(inputByteArray, inputByteArray.Length);
                textBox2.Text = x1.ToString();
            }
        }
        public string crc16_modbus(byte[] modbusdata, int Length)
        {
            uint i, j;
            uint crc16 = 0xFFFF;
            for (i = 0; i < Length; i++)
            {
                crc16 ^= modbusdata[i];  //CRC=BYTE xor CRC
                for (j = 0; j < 8; j++)
                {
                    if ((crc16 & 0x01) == 1) //如果CRC最後一位是1,右移動一位後carry=1,則將CRC右移動一位後,再與POLY16=0xA001進行xor運算
                    {
                        crc16 = (crc16 >> 1) ^ 0xA001;
                    }
                    else
                    {
                        crc16 = crc16 >> 1;//如果CRC最後一位爲0,則只將CRC右移一位
                    }
                }
                
            }
            string crc16_1 = string.Format("{0:X}", crc16);
            if (crc16_1.Length % 2 > 0)
            {
                crc16_1 = "0" + crc16_1;//如果高位隱藏0,則補充
            }
            crc16_1 = crc16_1.Substring(2, 2) + crc16_1.Substring(0, 2);//交換前後字節
            return crc16_1;
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章