Расчет Modbus CRC с использованием VB.Net - PullRequest
0 голосов
/ 27 августа 2018

Я пытался вычислить CRC, используя VB.Net, но значение отличается.

Пример, если я использую 05 03 0B D3 00 01 код данных CRC должен быть 76 53, но я получаю B6 45

Это мой код VB.Net.

Private Function CRC(data As Byte()) As Byte()
    Dim crcfull As UShort = &HFFFF
    Dim crchigh As Byte = &HF, crclow As Byte = &HFF
    Dim crclsb As Char
    Dim result As Byte() = New Byte(1) {}
    For i As Integer = 0 To (data.Length) - 3
        crcfull = CUShort(crcfull Xor data(i))
        For j As Integer = 0 To 7
            crclsb = ChrW(crcfull And &H1)
            crcfull = CUShort((crcfull >> 1) And &H7FFF)
            If Convert.ToInt32(crclsb) Then
                crcfull = CUShort(crcfull Xor &HA001)
            End If
        Next
    Next
    crchigh = CByte((crcfull >> 8) And &HFF)
    crclow = CByte(crcfull And &HFF)
    Return New Byte(1) {crclow, crchigh}
End Function

В чем проблема?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я на самом деле не эксперт по VB, я занимаюсь в основном C, C ++ и C #, но я думаю, что это было одно из ваших преобразований, которое, я думаю, не нужно. Это работает для меня:

Function CRC16(data As Byte()) As Byte()
    Dim crcfull As UInt16 = &HFFFF
    Dim crchigh As Byte, crclow As Byte
    Dim crclsb As Byte

    For i As Integer = 0 To data.Length - 1
        crcfull = crcfull Xor data(i)

        For j As Integer = 0 To 7
            crclsb = crcfull And &H1
            crcfull = crcfull >> 1

            If (crclsb <> 0) Then
                crcfull = crcfull Xor &HA001
            End If
        Next
    Next

    crchigh = (crcfull >> 8) And &HFF
    crclow = crcfull And &HFF
    Return New Byte(1) {crclow, crchigh}
End Function
0 голосов
/ 27 августа 2018

Вы должны включить опцию строго, вы увидите, что в этой строке есть проблема.

If Convert.ToInt32(crclsb) Then

Я не уверен, что он должен делать, но вы не можете делать оператор If с целым числом, это должно быть логическое значение.

...