vb.net进行CRC-16/MODBUS校验(调用C#dll),对16进制输入进行CRC校验输出

如果使用vb.net进行串口通讯测试,就需要发送串口指令,一般是16进制数据,并且,大部分串口设备会对指令码进行crc校验。

通常来说,串口通讯的crc校验模型都是crc-16/modbus。

一、原理解释


crc-16/modbus模型,其原理解释如下:

  1. 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。

  2. 把第一个 8 位二进制数据 (通信信息帧的第一个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。

  3. 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位。

  4. 如果移出位为 0, 重复第 3 步 ( 再次右移一位); 如果移出位为 1, CRC 寄存器与多项式A001 ( ‭1010 0000 0000 0001) 进行异或。

  5. 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进行了处理。

  6. 重复步骤 2 到步骤 5, 进行通信信息帧下一个字节的处理。

  7. 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。

  8. 最后得到的 CRC寄存器内容即为 CRC码。

以上是crc-16/modbus模型实现的原理,在实际编程中,.net环境下,使用C#更容易实现。所以,可以利用C#建立一个类库(.dll),然后在vb.net中调用此类库即可。

下面来看具体实现:

二、C#实现


首先是在visual studio中新建一个c#类库,

并在其中建立带返回值的函数,命名为crc16.

crc16程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using System.Text;
using System.Threading.Tasks;

namespace crc_check_lib
{
    public class crc_check
    {
        public string crc_to_16(string strinput)
        {
            ushort crc = 0xffff;
            ushort x;
            byte[] data = Getbytefromhexstring(strinput);
            for (int i = 0; i < data.Length; i++)
            {
                crc ^= (ushort)(data[i]);
                for (int j = 0; j < 8; j++)
                {
                    if ((crc & 0x0001) != 0)
                    {
                        crc >>= 1;
                        crc ^= 0xA001;
                    }

                    else
                    {
                        crc >>= 1;
                    }

                }
            }
            //高低字节交换
            x = (byte)(crc >> 8);

            crc = (ushort)(crc << 8);

            crc = (ushort)(crc + x);

            return crc.ToString("X4");  // X4 表示将整型数值输出成4位16进制形式的大写字符

        }
        public Byte[] Getbytefromhexstring(string strinput)
        {
            Byte[] bytearoutput = new byte[] { };
            if (!string.IsNullOrEmpty(strinput) && strinput.Length % 2 == 0)
            {
                SoapHexBinary hexBinary = null;
                try
                {
                    hexBinary = SoapHexBinary.Parse(strinput);
                    if (hexBinary != null)
                    {
                        bytearoutput = hexBinary.Value;
                    }
                }
                catch (Exception ex)
                {

                }
            }

            return bytearoutput;
        }
        
    }
}

当C#程序写好后,在visual studio中点击“生成”,编译成功后,会生成包含当前crc校验功能函数的dll文件。

三、vb.net调用


然后再在visual studio中建立一个vb.net窗体,在窗体的引用中,点击“添加引用”,选择项目,可以在列表中看到刚才生成的C#类库文件,勾选即可。
vb.net进行CRC-16/MODBUS校验(调用C#dll),对16进制输入进行CRC校验输出_第1张图片

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim crc As New crc_check
        Dim s As String
        s = TextBox1.Text
        s = s.Replace(" ", "")

        If (s.Length Mod 2 = 0) Then            '输入的字符应该是偶数,16进制的倍数

            TextBox2.Text = crc.crc_to_16(TextBox1.Text)

        Else

            MsgBox("输入字符长度有问题", MsgBoxStyle.Information, "输入提示!")

        End If

    End Sub

C#中对于位的操作要比在vb.net中方便,因为crc16校验中涉及多次位的移位操作,因此采用这种方案比较方便。visual studio的集成编程,使得多个编程语言可以混合使用,这样就可以对某个功能函数采用最适合其的语言进行编程,随后将其生成类库,再在其他地方进行调用,方便快捷。

你可能感兴趣的:(VB.net实例应用,C#实例应用,.net,c#,开发语言)