我有一个连接到CANbus的设备,通过它我接收到一系列bytearray,我正试图用python处理它们。我想知道什么是将bytearray解构成它的组成部分的最佳(最简单/最优雅)方法。目前,我正在使用一个类,该类包含许多与各个部分相对应的变量,并在该类的构造函数中手动加载每个元素。我可以在网上找到this,但这只处理“标准”打包(2的幂),而这里我有一些字段的大小是奇数。代码如下:
Struct(C++):
struct struct_name {
unsigned CloseLoopErrH:8;
unsigned CloseLoopErrM:8;
unsigned CloseLoopErrL:8;
unsigned AppliedThrottle_h3:3;
unsigned Fault_RevSoftLim:1;
// ...
};
Python(使用Python can通过can获取消息):
class Parser(object):
CloseLoopErrH = 0
CloseLoopErrM = 0
CloseLoopErrL = 0
AppliedThrottle_h3 = 0
Fault_RevSoftLim = 0
Fault_ForSoftLim = 0
# ...
def __init__(self, msg):
self.CloseLoopErrH = msg.data[0]
self.CloseLoopErrM = msg.data[1]
self.CloseLoopErrL = msg.data[2]
self.AppliedThrottle_h3 = (msg.data[3] & 0xE0) >> 5
self.Fault_RevSoftLim = (msg.data[3] & 0x10) >> 4
self.Fault_ForSoftLim = (msg.data[3] & 0x08) >> 3
# ...
def __str__(self):
return """\
CloseLoopErrH: %d, CloseLoopErrM: %d, CloseLoopErrL: %d,
AppliedThrottle_h3: %d, Fault_RevSoftLim: %d, Fault_ForSoftLim: %d,
""" % (self.CloseLoopErrH, self.CloseLoopErrM, self.CloseLoopErrL,
self.AppliedThrottle_h3, self.Fault_RevSoftLim, self.Fault_ForSoftLim)
def main():
bus = can.interface.Bus()
for msg in bus:
print Parser(msg.data)
main()
首先将变量设置为空,然后调用
unpack
更多文档here。你知道吗
我们可以做角色:
或组合:
所有格式都在文档中。你知道吗
相关问题 更多 >
编程相关推荐