为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶刀刀 2022-12-20 15:18:48
背景我正在使用python-seabreeze与光谱仪交谈。一些但不是所有可用命令都在 python-seabreeze 中实现。从OceanOptics Flame-T手册中可以看到有如下命令(举例):..0x09 Request Spectra0x0A Set Trigger Mode0x0B Query number of Plug-in Accessories Present0x0C Query Plug-in Identifiers0x0D Detect Plug-ins0x12 LED Status0x60 General I2C Read0x61 General I2C Write0x62 General SPI I/O0x68 PSOC Read0x69 PSOC Write0x6A Write Register Information0x6B Read Register Information0x6C Read PCB Temperature0x6D 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
查看完整描述

1 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞


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


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 作为 pack 函数的第一个输入,而将其余值留给用户。每个操作在操作 ID 后需要不同的值,有些需要更多(“BBH”),有些需要更少(“B”)。


对于 0x6c,我会搜索格式并从那里了解我还剩下什么来提供这个包功能。


查看完整回答
反对 回复 2022-12-20
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号