немогу подсчитать CRC16

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

немогу подсчитать CRC16

Сообщение Penumbra » 24.01.2009 (Сб) 13:44

немогу подсчитать CRC16 для этого байтового пакета
0D 38 87 43 00 00 00 00 01 00 01 29 6A
где 29 6A - это CRC
0D -контрольный байт , указывающий колво байт в пакете
в задании неговорится о том учитывается 0D или нет

подститать нуна согласно http://ostapbenderx.narod.ru/Data/9/905/103.jpg
может кто подскажет как это посчитать?

у меня почемуто постоянно получается B0 D1 с учетом 0D
и отрицательное число без учета 0D
использую этот код
Код: Выделить всё
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Просчет контрольной суммы
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function CRC16(DataArray() As Byte, Optional wInitCRC As Long = 0) As Long
Dim crc As Integer, j As Byte, size As Integer, i As Long
crc = wInitCRC
For i = 0 To DataArray(1) - 3
    crc = crc Xor PDL((DataArray(i)), 8)
    For j = 0 To 7
        If crc And &H8000 Then
            crc = PDL(crc, 1) Xor &H1021
        Else
            crc = PDL(crc, 1)
        End If
    Next j
Next i
CRC16 = crc
End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Поразрядный сдвиг влево

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function PDL(d As Integer, Optional j As Integer = 1) As Integer
Dim pdlBytes(0 To 15) As Boolean
Dim i As Integer, t As Integer, k As Integer
'получаем массив битов
For i = 1 To 16
    pdlBytes(16 - i) = d And (2 ^ (i - 1))
Next i
'сдвигаем все влево
For k = 1 To j
    For i = 1 To 15
        pdlBytes(i - 1) = pdlBytes(i)
    Next i
    pdlBytes(15) = False
Next k
'собираем обратно число
For i = 1 To 15
    If pdlBytes(i) Then
        t = t Or 2 ^ (15 - i)
    End If
Next i
If pdlBytes(0) Then t = t Or &H8000

PDL = t
End Function

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: немогу подсчитать CRC16

Сообщение alibek » 24.01.2009 (Сб) 13:57

А почему wInitCRC=0? И почему As Long?
А функция PDL ужасна. Сдвигать биты можно и лучше.
Lasciate ogni speranza, voi ch'entrate.

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: немогу подсчитать CRC16

Сообщение Penumbra » 24.01.2009 (Сб) 18:16

исправил на Integer
всеравно результаты несовподают

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: немогу подсчитать CRC16

Сообщение tyomitch » 24.01.2009 (Сб) 19:06

Какая вообще связь между твоей инструкцией и твоим кодом?
В частности, откуда там взялось &H1021?
Изображение

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: немогу подсчитать CRC16

Сообщение Penumbra » 25.01.2009 (Вс) 2:55

&H1021- это вроде как полином

Name : "CRC 16/CITT"
Width : 16
Poly : 1021 пробовал и 811
Init : FFFF пробовал и 84CF пробовал и F0B8 и 3512
пробовал
Name : "CRC 16"
Width : 16
Poly : 8005 пробовал и 4003
Init : 0
аа, неполучается!

Какая вообще связь между твоей инструкцией и твоим кодом?

мне тоже интерестно :shock:
вообще в задании говорится
дано
N|DATA|CRC
N-контрольный байт , указывающий колво байт в пакете
CRC-контрольная сумма CRC16 (приложение А стандарта МЭК 61142)
и дан пример пакета
0D 38 87 43 00 00 00 00 01 00 01 29 6A онже в стринговой форме - .8‡C.....)j

а у меня мыслеу нету уже!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 48

    TopList  
cron