我想用以下格式查看我的数据包: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
对此我很困惑,请帮助我
答案 0 :(得分:0)
在Modbus-TCP中:
transaction
是2Byte ==短== H
identifier
是2Byte ==短== H
length
是2Byte ==短== H
unitid
是1Byte == B
fcode
是1Byte == B
reg_addr
是2Byte ==短== H
count
是2Byte ==短== 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'
[更新]:
无论如何,如果您想要这样(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。 >
是大尾数法。
我使用 Python2.7 和 Python3.6 测试这些代码段。
struct.error: required argument is not an integer
错误,请与int(<hex-str>, 16)
一起使用