Что нового

Расчет КС посылка по COM порту

VadimKHL

Новичок
Сообщения
155
Репутация
0
Добрый день!
Запутался в преобразованиях переменных.

Раньше просто посылал команды вот таким куском, вручную рассчитывая КС.
Код:
; Передать 10 байт команды запроса статуса устройства (ожидаем завершения передачи данных).
Local $bBinData = Binary("0x2423010000000000DADC")
Local $tBinData = DllStructCreate("byte[10]")
DllStructSetData($tBinData, 1, $bBinData)
_CommSendByteArray(DllStructGetPtr($tBinData),10,1)


Теперь в сообщение потребовалось ввести пару переменных, сделал вот так:
Код:
Local $TXBYTE[10]
$TXBYTE[0] = 36             ; Старт байт 24h.
$TXBYTE[1] = 36             ; Команда управления , 24h.
$TXBYTE[2] = GUICtrlRead($idPIRISed, $GUI_READ_DEFAULT) ; Число из поля Input.
$TXBYTE[3] = 0              ; Mode регистр, 00h - управление обоими каналами.
$TXBYTE[4] = 0
$TXBYTE[5] = 0
$TXBYTE[6] = 0
$TXBYTE[7] = 0
$TXBYTE[8] = 0
$TXBYTE[9] = 0

; Расчет КС.
Local $CRCRES = $TXBYTE[0] * 256 + $TXBYTE[1]               ; Загружаем 1-ое 16-битное слово в переменную результа КС.
For $i = 2 to 8 Step 2
   $CRCRES = $CRCRES + ($TXBYTE[$i] * 256 + $TXBYTE[$i+1])  ; Прибавляем к результату КС следующее 16-битное слово.
   If $CRCRES >= 65536 Then                                 ; Если было переполнение 16-битного слова, выделяем результат только 16-битного слова, а перенос добавляем (- 65536 + 1).
	  $CRCRES = $CRCRES - 65535
   EndIf
Next
$CRCRES = 65535 - $CRCRES                                   ; Инвертируем 16-битное слово.

MsgBox (0, "CRC", $CRCRES)


Расчет КС происходит верный, 56027 если в поле INPUT число 1.
Но как дальше преобразовать данной сообщение и передать функции (1 кусок кода).

Помогите плиз!

P.S.: Для передачи пользуюсь CommMG.dll.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Может быть так
Код:
Local $bBinData = StringToBinary(56027)



Добавлено:
Сообщение автоматически объединено:

Или может быть так:
Код:
Local $bBinData = Binary("0x242301000000") & Hex(56027)



Добавлено:
Сообщение автоматически объединено:

И еще нужно $TXBYTE[2] вставить так ж
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Да нет.
Попробую вопрос немного изменить.

Для отправки 10 байт по ком порту, делал вот так:
Код:
; Передать 10 байт команды запроса статуса устройства (ожидаем завершения передачи данных).
Local $bBinData = Binary("0x2424010000000000DADB")
Local $tBinData = DllStructCreate("byte[10]")
DllStructSetData($tBinData, 1, $bBinData)
_CommSendByteArray(DllStructGetPtr($tBinData),10,1)


В таком варианте работает все ок.
Отправляются следующие 10 байт:
24h;23;01h;00h;00h;00h;00h;00h;DA;DB.

Мне сейчас в сообщение нужно произвольно менять допустим 3 байт.
Если его меняешь, требуется пересчитать КС сумму, последние два байта.

Как с этим можно справиться?


Добавлено:
Сообщение автоматически объединено:

24h;24h;01h;00h;00h;00h;00h;00h;DA;DB.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
Local $bBinData = Binary("0x2424")  & Hex($TXBYTE[2], 2) & "000000" & Hex(56027) ;Вместо 56027 рассчитанный crc



Добавлено:
Сообщение автоматически объединено:

Можно собирать "двоичные" данные из строки '0x' & '23' & '23' & '01' & 'остальные байты' & Hex(контрольная сумма, длинна)
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Спасибо! Получилось! :beer:
Сделал вот так:
Код:
Local $TXBYTE[10]
$TXBYTE[0] = 36             ; Старт байт 24h.
$TXBYTE[1] = 36             ; Команда управления, 24h.
$TXBYTE[2] = $vPIRIS     ; Число в поле.
$TXBYTE[3] = $vMODE     ; Mode регистр.
$TXBYTE[4] = 0
$TXBYTE[5] = 0
$TXBYTE[6] = 0
$TXBYTE[7] = 0
$TXBYTE[8] = 0
$TXBYTE[9] = 0

; Расчет КС.
Local $CRCRES = $TXBYTE[0] * 256 + $TXBYTE[1]               ; Загружаем 1-ое 16-битное слово в переменную результа КС.
For $i = 2 to 8 Step 2
   $CRCRES = $CRCRES + ($TXBYTE[$i] * 256 + $TXBYTE[$i+1])  ; Прибавляем к результату КС следующее 16-битное слово.
   If $CRCRES >= 65536 Then                                 ; Если было переполнение 16-битного слова, выделяем результат только 16-битного слова, а перенос добавляем (- 65536 + 1).
	  $CRCRES = $CRCRES - 65535
   EndIf
Next
$CRCRES = 65535 - $CRCRES                                   ; Инвертируем 16-битное слово.

Local $bBinData = '0x' & Hex($TXBYTE[0],2) & Hex($TXBYTE[1],2) & Hex($TXBYTE[2],2) & Hex($TXBYTE[3],2) & Hex($TXBYTE[4],2) & Hex($TXBYTE[5],2) & Hex($TXBYTE[6],2) & Hex($TXBYTE[7],2) & Hex($CRCRES,4)

; Очищаем выходной/входной буфер.
_CommClearOutputBuffer()
_CommClearInputBuffer()

; Передать 10 байт сообщения (ожидаем завершения передачи данных).
Local $tBinData = DllStructCreate("byte[10]")
DllStructSetData($tBinData, 1, $bBinData)
_CommSendByteArray(DllStructGetPtr($tBinData),10,1)
 
Верх