有谁用VB.NET语言写过Modbus网络协议?过来帮帮忙吧,谢谢了

HAHYY

本人菜鸟,用vb2005写串口通信,有用到MODBUS协议,在做CRC校验的时候出问题,希望高手指点,不管说点什么估计都有点用,我现在都不知道怎么办了,程序如下:
        Dim bisend() As Byte
      Dim Scrc
      Dim Rcrc
      Dim SbtLoCRC As Byte, SbtHiCRC As Byte
      '发送数据,以数组发送以下字节
        ReDim bisend(7) '重新定义数组长度
        bisend(0) = "&h" + Hex(1) '地址码
        bisend(1) = "&h" + Hex(3) '功能码 读寄存器
        bisend(2) = "&h" + Hex(0) '起始地址高位
        bisend(3) = "&h" + Hex(0) '起始地址低位
        bisend(4) = "&h" + Hex(0) '寄存器个数高位
        bisend(5) = "&h" + Hex(1) '寄存器个数低位
        Scrc = CRC16(bisend, 6, SbtLoCRC, SbtHiCRC) 'CRC校验
        bisend(6) = "&h" + Hex(SbtLoCRC) 'CRC高位
        bisend(7) = "&h" + Hex(SbtHiCRC) 'CRC低位
        RS232.Write(bisend, 0, 8)
  '以下为CRC校验函数,这是网上找到的
    '******************************************
    Private Function CRC16(ByVal Data() As Byte, ByVal no As Integer, ByVal CRC16Lo As Byte, ByVal CRC16Hi As Byte) As Byte()
        Dim CL As Byte, CH As Byte
        Dim SaveHi As Byte, SaveLo As Byte
        Dim i As Integer
        Dim Wno As Integer
        CRC16Lo = &HFF
        CRC16Hi = &HFF
        CL = &H1
        CH = &HA0
        For i = 0 To no - 1
            CRC16Lo = CRC16Lo Xor Data(i) '每一个数据与CRC寄存器进行异或
            For Wno = 0 To 7
                SaveHi = CRC16Hi
                SaveLo = CRC16Lo
                CRC16Hi = CRC16Hi \ 2 '高位右移一位
                CRC16Lo = CRC16Lo \ 2 '低位右移一位
                If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
                    CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
                End If '否则自动补0
                If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或
                    CRC16Hi = CRC16Hi Xor CH
                    CRC16Lo = CRC16Lo Xor CL
                End If
            Next Wno
        Next i
        Dim ReturnData(1) As Byte
        ReturnData(0) = CRC16Hi 'CRC高位
        ReturnData(1) = CRC16Lo 'CRC低位
        CRC16 = ReturnData
    End Function
这只是数据的发送部分,在发送的时候做CRC校验,SbtLoCRC,SbtHiCRC返回值都是0。接收数据的时候CRC校验返回的高位与低位也是零,我在想是不是CRC校验程序有问题。希望高手解答,
以下是数据接收:
        Dim INByte() As Byte
      Dim RbtLoCRC As Byte, RbtHiCRC As Byte 
        ReDim INByte(RS232.BytesToRead) '重新定义数组长度
        RS232.Read(INByte, 0, RS232.BytesToRead)
      If INByte(1) = bisend(1) And INByte(0) = bisend(0) Then '判断功能码与地址码
        'CRC校验
        Rcrc = CRC16(INByte, UBound(INByte) - LBound(INByte) - 1, RbtLoCRC, RbtHiCRC)
        If INByte(UBound(INByte) - 1) = RbtLoCRC And INByte(UBound(INByte)) = RbtHiCRC Then'判断功能码与地址码
******中间程序没写
        End If

这里对接收的数据进行CRC校验返回的值也是0