0 голосов
спросил от в категории VB6
Похоже, код C, но не завершен. Часть кода отсутствует.
Правильно отступом код легче читать.
#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-расчет. < br>
#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                       ) ; }
# [#^ #]

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
0 голосов
ответил от
Вот мой итоговый 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


Спасибо за вашу помощь всем
0 голосов
ответил от
Спасибо всем, что я начну изучать это. Причина, по которой я пытаюсь найти решение VB6, заключается в том, что это будет реализовано в гораздо более крупном проекте, написанном на C. Спасибо за форматирование ppolymorphe. Это сделало его намного яснее. Будет опубликовать то, что я придумал.
0 голосов
ответил от
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 Foloding Codepart описывает вычисление CRC-Char. Тип U8 - это 8-битный unsigned var (от 0 до 255)
Функция put_tx1_buffer (U8 c) отправляет Char по serielport
0 голосов
ответил от
Вам не нужно переводить с немецкого языка. Но вам нужно понимать языки программирования C и VB6 . Вы также можете создать DLL с помощью источника C и использовать его в своем приложении VB6 .
0 голосов
ответил от
Это C-реализация вычисления CRC, написанного, вероятно, для какого-то микроконтроллера.

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

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

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

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

Категории

Добро пожаловать на сайт DraftingCode Q&A, где вы можете задавать вопросы и получать ответы от других членов сообщества.

Связанных вопросов не найдено

...