如何使用struct.pack格式构造字节?

背景

我正在使用python-seabreeze与光谱仪交谈。一些但不是所有可用命令都在 python-seabreeze 中实现。从OceanOptics Flame-T手册中可以看到有如下命令(举例):

.

.

0x09 Request Spectra

0x0A Set Trigger Mode

0x0B Query number of Plug-in Accessories Present

0x0C Query Plug-in Identifiers

0x0D Detect Plug-ins

0x12 LED Status

0x60 General I2C Read

0x61 General I2C Write

0x62 General SPI I/O

0x68 PSOC Read

0x69 PSOC Write

0x6A Write Register Information

0x6B Read Register Information

0x6C Read PCB Temperature

0x6D Read Irradiance Calibration

.

.

seabreeze/pyseabreeze/protocol.py我可以看到这些命令是这样形成的:

import functoolsimport struct 

msgs = {
    code: functools.partial(struct.Struct(msg).pack, code)    for code, msg in {        0x01: "<B",  # OP_INITIALIZE
        0x02: "<BI",  # OP_ITIME
        0x03: "<BH",  # set Strobe/Lamp enable Line
        0x05: "<BB",  # OP_GETINFO
        0x09: "<B",  # OP_REQUESTSPEC
        0x0A: "<BH",  # OP_SETTRIGMODE
        0x6A: "<BBH",  # OP_WRITE_REGISTER
        0x6B: "<BB",  # OP_READ_REGISTER
        0x71: "<BBB",  # OP_TECENABLE_QE
        0x72: "<B",  # OP_READTEC_QE
        0x73: "<Bh",  # OP_TECSETTEMP_QE
        0xFE: "<B",  # OP_USBMODE
    }.items()
}  # add more here if you implement new features

例如Request Spectra,根据手册是0x09,当它来自 python 时,一条消息

struct.Struct('<B').pack(0x09)

已发送。我试图通过阅读struct format strings来了解发生了什么,我发现这<意味着“小端”, B意味着无符号字符,h意味着短,等等。

从手册中应该如何知道格式是,而格式OP_GETINFO是?这是什么逻辑?你会把什么格式和为什么?<BBOP_WRITE_REGISTER<BBH0x6C Read PCB Temperature


蝴蝶刀刀
浏览 136回答 1
1回答

慕田峪4524236

似乎您需要阅读需要使用哪些参数才能发送合法命令,该协议仅定义了您希望发送的一些项目,例如:code_partial_function = functools.partial(struct.Struct(msg).pack, code)...0x6B: "<BB",&nbsp; # OP_READ_REGISTER...# used like this later:# example for register number 1# final_packed_bytes will contain both the operation id and the register numberfinal_packed_bytes = code_partial_function(0x1)对于这个读取寄存器的操作,protocol.py 将创建一个已经包含操作 id (0x6b) 的部分函数,并将要求您提供额外的“B”,表示另一个无符号字符,可能是您希望读取的寄存器编号。该协议仅提供 ID 作为 pack 函数的第一个输入,而将其余值留给用户。每个操作在操作 ID 后需要不同的值,有些需要更多(“BBH”),有些需要更少(“B”)。对于 0x6c,我会搜索格式并从那里了解我还剩下什么来提供这个包功能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python