Himachandra Ответов: 1

Расчет CRC-16 Modbus


Хай Все,
Пока я пишу код для расчета CRC16 Modbus. Но дает некоторые неправильные значения. Может ли кто-нибудь меня поправить ?......
Вот мой код.... мой ввод-значение ASCII
Public Function getCRC16(ByVal strInput As String)
        Dim lngCheck As Long
        Dim Power(7) As Integer
        Dim I As Integer
        Dim J As Integer
        Dim Poly As Long
        Dim CRC As Long
        Dim TestBit As Boolean
        Dim TestBit1 As Boolean
        Dim TestBit2 As Boolean

        Poly = &H1021
        CRC = &HFFFF

        For J = 0 To 7
            Power(J) = 2 ^ J
        Next J

        For I = 1 To Len(strInput) Step 2
            lngCheck = Val("&H" & Mid$(strInput, I, 2))
            For J = 7 To 0 Step -1
                If (CRC And 32768) = 32768 Then
                    TestBit1 = True
                Else
                    TestBit1 = False
                End If

                If (lngCheck And Power(J)) = Power(J) Then
                    TestBit2 = True
                Else
                    TestBit2 = False
                End If

                TestBit = TestBit1 Xor TestBit2
                CRC = (CRC And 32767) * 2
                If TestBit = True Then
                    CRC = CRC Xor Poly
                End If

            Next J
        Next I

        Dim tmp As String
        tmp = Hex(CRC)
        getCRC16 = tmp
        MsgBox(tmp)
    End Function

Sandeep Mewara

Какие неправильные ценности? Непонятный.

Himachandra

Для 1234 контрольные суммы CRC16-это 30BA
Но в этом он давал EC9

1 Ответов

Рейтинг:
5

CPallini

Обычно CRC16 расчет производится на основе таблиц (для достижения лучшей производительности). Вы можете найти его, например, здесь: "Алгоритм Modbus CRC16 в C# и VB.Net"[^]


Sergey Alexandrovich Kryukov

Хороший ответ, мой 5.
--СА

Himachandra

Как я могу выполнить этот код в VB.NET
Когда я нажимаю на кнопку, Мне нужен CRC16 Modbus для данных текстового поля.......

CPallini

Использование кода (VB) по ссылке, которую я предоставил, должно быть простым.

Himachandra

Как это выполнить plzzzzz.......