Member 11644953 Ответов: 6

Немецкое руководство по эксплуатации CRC код в VB6


Привет
Извините, очень длинный выстрел, но у меня есть руководство на немецком языке, которое сбивает меня с толку! Он показывает, как вычислить значение CRC для последовательного устройства, для которого я пытаюсь написать код в VB6. Я не только не понимаю немецкого языка, но и пример не на том языке, который я узнаю (падая на каждом препятствии!). В конечном счете мне нужно превратить все, что это показывает, в код VB6, но даже знание того, на каком языке находится этот пример, поможет мне в поиске в Google.

Вот оно....

4.6 Berechnung des CRC-Zeichens
Folgender Programmabschnitt erklärt die Berechnung des CRC-Zeichens. Der Type U8 ist eine 8bit-переменная ohne Vorzeichen (0 bis 255)
Die Funktion put_tx1_buffer( U8 c) sendet ein Zeichen über die serielle Schnittstelle.


#define POLYNOM 0xB1  // 28+27+25+24+20+1
#define INIT_TX_CRC {tx_crc=0xA5;} U8 tx_crc ;
void build_tx_crc8( U8 a )
{
U8 i=8 ;
do
{
if (( a & 0x01 ) != ( tx_crc & 0x01 ))
{
tx_crc >>= 1 ;
tx_crc ^= POLYNOM ;
}
else
{
tx_crc >>= 1 ;
}
a >>= 1 ;
}
while  (--i!=0) ;
}

void set_lamp( U8 keyboardnumber, U8 lampnumber, U8 command )
{
INIT_TX_CRC ;
put_tx1_buffer( STX+0x80               ) ; build_tx_crc8( STX+0x80             ) ; put_tx1_buffer( command                  ) ; build_tx_crc8( command                  ) ; put_tx1_buffer( keyboardnumber      ) ; build_tx_crc8( keyboardnumber       ) ; put_tx1_buffer( lampnumber             ) ; build_tx_crc8( lampnumber              ) ; put_tx1_buffer( ETX+0x80               ) ; build_tx_crc8( ETX+0x80               ) ; put_tx1_buffer( tx_crc                       ) ;
}


Что я уже пробовал:

Google translate, C#, но, похоже, это было не так.

6 Ответов

Рейтинг:
48

Patrice T

Выглядит как код на языке Си, но не полный. Часть кода отсутствует.
Правильно выделенный код легче читать.

#define POLYNOM 0xB1  // 28+27+25+24+20+1
#define INIT_TX_CRC {tx_crc=0xA5;} U8 tx_crc ;
void build_tx_crc8( U8 a )
{
    U8 i=8 ;
    do
    {
        if (( a & 0x01 ) != ( tx_crc & 0x01 ))
        {
            tx_crc >>= 1 ;
            tx_crc ^= POLYNOM ;
        }
        else
        {
            tx_crc >>= 1 ;
        }
        a >>= 1 ;
    }
    while  (--i!=0) ;
}

void set_lamp( U8 keyboardnumber, U8 lampnumber, U8 command )
{
    INIT_TX_CRC ;
    put_tx1_buffer( STX+0x80               ) ;
    build_tx_crc8( STX+0x80             ) ;
    put_tx1_buffer( command                  ) ;
    build_tx_crc8( command                  ) ;
    put_tx1_buffer( keyboardnumber      ) ;
    build_tx_crc8( keyboardnumber       ) ;
    put_tx1_buffer( lampnumber             ) ;
    build_tx_crc8( lampnumber              ) ;
    put_tx1_buffer( ETX+0x80               ) ;
    build_tx_crc8( ETX+0x80               ) ;
    put_tx1_buffer( tx_crc                       ) ;
}

Это похоже на какой-то 8-битный расчет CRC.
Циклический избыточный код - Википедия[^]


Рейтинг:
43

Jochen Arndt

Это C-реализация вычисления CRC, написанная, вероятно, для какого-то микроконтроллера.

Даже если бы вы знали C и понимали алгоритм, не было бы особого смысла преобразовывать его в VB6 (пока это возможно). Вероятно, вы хотите вычислить CRC для строки или последовательности двоичных данных. Вы должны быть в состоянии найти примеры в сети.

Если вы собираетесь написать код для того же устройства, что и код C, вы должны использовать то же начальное значение (hex A5) и тот же полином (hex B1). Если нет, то они должны быть указаны в документации к вашему последовательному устройству.

Затем реализуйте алгоритм CRC в VB, используя примеры из сети.

Или сделай это сам. Это довольно просто:


  • Вы работаете с байтовыми значениями (которые также могут быть одиночными символами)
  • Создайте переменную для хранения CRC и инициализируйте ее начальным значением
  • Примените CRC для каждого байта / символа входного сигнала в цикле, обрабатывающем 8 бит:
    • Если LSB (младший бит) входного байта и CRC идентичны, сдвиньте оба вправо на единицу
    • В противном случае сдвиньте также и вправо на единицу и XOR значение CRC с полиномом
  • Переменная CRC теперь содержит вычисленный CRC


Рейтинг:
4

Member 11644953

Вот мой результирующий VB6 для расчета CRC для всех, кто считает его полезным.

Private tx_crc As Integer
Private Const Polynom As Integer = &HB1    ' 28+27+25+24+20+1

Public Sub InitTxCrc()
    tx_crc = &HA5
End Sub


Public Sub BuildTxCrc(ByVal a As Integer)
    a = a And &HFF    ' Make it byte
    Dim i As Integer
    i = 8

    Do

        If ((a And 1) <> (tx_crc And 1)) Then
            tx_crc = tx_crc \ 2
            tx_crc = tx_crc Xor Polynom
        Else
            tx_crc = tx_crc \ 2
        End If
        i = i - 1
        a = a \ 2
    Loop Until i = 0

End Sub

Public Sub BuildTxCrcHex(ByVal ah As String)
    BuildTxCrc (Val("&H" & ah))
End Sub

Public Function GetTxCrc() As Integer
    GetTxCrc = tx_crc
End Function


Всем спасибо за вашу помощь


Рейтинг:
2

Member 11644953

Спасибо всем, я начну разбираться с этим. Причина, по которой я пытаюсь найти решение VB6, заключается в том, что оно будет реализовано в гораздо более крупном проекте, написанном на языке C. Спасибо за форматирование ppolymorphe. Это сделало его гораздо яснее. Выложу то, что придумаю.


Рейтинг:
1

CPallini

Вам не нужно переводить с немецкого. Но вам нужно понять, как C и VB6 язык программы. Вы также можете построить DLL использование C источник и потреблять его в вашем VB6 приложение.


Рейтинг:
1

F. Xaver

4.6 Berechnung des CRC-Zeichens
Folgender Programmabschnitt erklärt die Berechnung des CRC-Zeichens. Der Type U8 ist eine 8bit-Variable ohne Vorzeichen (0 bis 255)
Die Funktion put_tx1_buffer( U8 c ) sendet ein Zeichen über die serielle Schnittstelle.


4.6 расчет CRC-Char
Следующая часть кода описывает вычисление CRC-Char. Тип U8 - это 8-битный беззнаковый var (от 0 до 255)
Функция put_tx1_buffer (U8 c) отправляет символ через serielport