Использование формата Struct.pack для строкового значения - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу увидеть мой пакет в следующем формате: b'\x00\x01\x00\x00\x00\x06

Но я вижу этот формат: \x00\x01\x06\x01\x03\ Как я могу это увидеть?

encoder=struct.pack('5B',int(trnsact,16),int(ident,16),int(length_data,16),int(unitid,16),int(func_code,16))

Это мои ценности:

transaction_id=0x00
ident_id=0x01
length_data=0x06
unitid=0x01
funccode=0x03

И type(transaction_id)=string (поэтому я делаю строковое значение целочисленным)

Если я использую этот тип:

encoder=struct.pack('5B',transaction,ident,unitid,funcode)

У меня есть эта ошибка: struct.error: required argument is not an integer

Я очень смущен, пожалуйста, помогите мне

1 Ответ

0 голосов
/ 02 ноября 2018

В Modbus-TCP:

  • transaction - 2 байт == Короткий == H
  • identifier 2Byte == Short == H
  • length равен 2 байт == Короткий == H
  • unitid равен 1 байт == B
  • fcode равен 1 байт == B
  • reg_addr - 2 байт == Короткий == H
  • count 2Byte == Short == H

Таким образом, формат в вашем случае будет >HHHBB или >3H2B:

import struct

transaction = 0x00
ident = 0x01
length_data = 0x06
unitid = 0x01
fcode = 0x03

encoder = struct.pack('>HHHBB', transaction, ident, length_data, unitid, fcode)
print(encoder)

Из:

b'\x00\x00\x00\x01\x00\x06\x01\x03'

[UPDATE]:

В любом случае, если вы хотите, чтобы это было так (b'\x00\x01\x00\x00\x00\x06), выполните следующие действия:

import struct

transaction = 0x00  # Used with replacement.
ident = 0x01  # Used with replacement.
length_data = 0x06  # Used.
unitid = 0x01  # Not used.
fcode = 0x03  # Not used.

encoder = struct.pack('>3H', ident, transaction, length_data)
print(encoder)

Из:

b'\x00\x01\x00\x00\x00\x06'

[ Примечание ]:

  • B - байт без знака.
  • H является беззнаковым коротким.
  • < - это Little Endian.
  • > - это Big Endian.

  • Я тестирую эти фрагменты кода с помощью Python2.7 и Python3.6 .

  • Вы также можете проверить эти фрагменты кода в Python3_online_IDE .
  • Однако, если вы столкнулись с ошибкой struct.error: required argument is not an integer, используйте с int(<hex-str>, 16)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...