如何在Python中将2个字节移动到3个位置?

如何在Python中将2个字节移动到3个位置?,python,byte,bitwise-operators,bit-shift,Python,Byte,Bitwise Operators,Bit Shift,我在这个宽带模块上运行了一个从油门位置传感器到“用户3”输入的5v信号。它有一个记录数据的RS232接口。到目前为止,我已经能够识别帧头以及哪些字节对应于“用户3”。我还验证了这些字节随着油门打开而增加。 相关文件 字节10至15是三个0至5.00伏用户输入U1、U2& U3(相比之下,2.0版还提供了额外的用户输入 至1.5)。虽然这些输入只采样一次,但它们会移位 在0到8184之间(即1024步-0,8,16..81768184) 对于版本1.5兼容性 在2.0单元上,每个通道只有一个10

我在这个宽带模块上运行了一个从油门位置传感器到“用户3”输入的5v信号。它有一个记录数据的RS232接口。到目前为止,我已经能够识别帧头以及哪些字节对应于“用户3”。我还验证了这些字节随着油门打开而增加。

相关文件

字节10至15是三个0至5.00伏用户输入U1、U2& U3(相比之下,2.0版还提供了额外的用户输入 至1.5)。虽然这些输入只采样一次,但它们会移位 在0到8184之间(即1024步-0,8,16..81768184) 对于版本1.5兼容性

在2.0单元上,每个通道只有一个10位采样,但是 为了与1.5数据兼容,结果移动了3个位置。 (即,版本1.5有1024个步骤-0、8、16..81768184) 兼容性

我不懂如何把字节转换成伏特。例子

  • 节气门关闭“\x03\xd8”(~0.67v)
  • 节气门打开“\x1c\x18”(~4.65v)

这似乎是[08184]到[0.0,5.0]范围内的简单线性变换

这将使转换方程

voltage = hex_in / 8184 * 5.0
其中hex_in是由这两个字节构成的整数。不幸的是,该算法与您的示例不符:

>>> 0x3d8 / 8192 * 5.0
0.6005859375
>>> 0x3d8 / 8184 * 5.0
0.6011730205278593

>>> 0x1c18 / 8184 * 5.0
4.393939393939394

如果你的例子有错误,也许我们有一个解决办法。如果它们是准确的,那么我们需要对值编码的完整描述。

哦,我看错了。它发送13位值,即使源中只有10位值。这就解释了为什么最低半字节为0bX000(低3位始终为零),而高半字节仅为0/1。所以不需要移位,因为它已经被规范化了(
high)你从哪里得到这些示例?它们似乎与描述不符。我得到0.601v和4。394v@user2864740你能试着计算一下这个转换吗?我试过8184和8192都对应于5.0v,但没有一个给出可靠的结果。谢谢!这看起来大致正确。
int.from_字节(低,'big'))/8192*5
&
int.from_字节(高,“大”)/8192*5
根据这个例子,我想8192是正确的,用于转换lambda16与空燃比。电气方面可能还有其他原因,因为我之前有一个labjack DAQ记录了这个电压信号,它低于我的万用表读数。至于值编码,第一个链路是th这是迄今为止我找到的关于解码帧的最好的文档。