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

np8

背景

我正在使用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 functools
import 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格式字符串的方法来试图了解正在发生的事情,并且发现这<意味着“ little endian”,B意味着unsigned char,h意味着short等。

应该怎么知道,从手动,该格式OP_GETINFO<BB,而OP_WRITE_REGISTER这是<BBH这里的逻辑是什么?您会采用什么格式0x6C Read PCB Temperature?为什么?

阿米特·伯格

似乎您需要阅读要使用什么参数才能发送合法命令,该协议仅定义了您希望发送的某些项目,例如:

code_partial_function = functools.partial(struct.Struct(msg).pack, code)
...
0x6B: "<BB",  # OP_READ_REGISTER
...

# used like this later:
# example for register number 1
# final_packed_bytes will contain both the operation id and the register number
final_packed_bytes = code_partial_function(0x1)

对于此操作读寄存器,protocol.py将创建一个已经包含操作ID(0x6b)的部分函数,​​并要求您提供附加的“ B”,表示另一个无符号字符,可能是您希望读取的寄存器号。

该协议仅将ID作为打包功能的第一个输入,而其余的值留给用户。每个操作在操作ID之后需要不同的值,有些需要更多(“ BBH”),有些需要更少(“ B”)。

对于0x6c,我将搜索格式并从中了解要给这个包函数留下什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何从D中的字节数组构造字符串

struct.pack_into需要更多字节,然后以格式指定

如何在bnfinit()中构造字段?

如何习惯使用堆引用构造struct?

如何使用键值对构造字符串数据

java.nio.BufferOverflowException 构造字节[]

尝试保存字节序时,Python struct.pack()'struct.error:struct格式的错误字符'

如何使用struct.pack作为字符串列表

如何使用struct.pack打包一个变量?

如何获得用于构造字符串的byte []?

swift如何在构造struct时使用enum作为参数?

对字符串值使用Struct.pack格式

如何使用struct构造函数初始化struct内的指针数组?

struct.pack()中的任意字节值

如何在多个数组中使用 str_replace 构造字符串的排列?

struct.error: 当我想使用 struct.pack() 时结构格式错误的字符

如何在struct中正确构造struct

包括不可移动可构造字段的类型如何可移动可构造?

在python中使用struct pack

如何通过从Shell脚本中的文件读取IP地址来构造字符串?

如何在嵌套的 jinja 模板中构造字符串值?

如何在PHP中检索发布的JSON,构造字符串和电子邮件

如何通过传入列表来构造字符串数组?

如何使用struct.unpack从python 3中的字节列表中提取int?

SWIG如何使用Lua表从Lua中的ac struct访问字节数组

使用react属性和es6模板功能构造字符串

使用std :: string的std :: hash专门化,无需构造字符串对象

使用在运行时之前未知的转义值(变量)构造字符串

如何使用普通的struct构造函数创建具有关联类型的值?