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

本人菜鸟,用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
