我正在尝试使用虚拟CAN网络导入CAN数据,当我解压缩CAN数据包时,结果很奇怪。我正在使用Python 3.3.7
代码: import socket,sys,struct
sock = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
interface = "vcan0"
try:
sock.bind((interface,))
except OSError:
sys.stderr.write("Could not bind to interface '%s'\n" % interface)
fmt = "<IB3x8s"
while True:
can_pkt = sock.recv(16)
can_id, length, data = struct.unpack(fmt, can_pkt)
can_id &= socket.CAN_EFF_MASK
data = data[:length]
print(data, can_id , can_pkt)
所以当我有一个看起来像这样的CAN数据包时。
candump vcan0: vcan0 0FF [8] 77 9C 3C 21 A2 9A B9 66
output in Python: b'\xff\x00\x00\x00\x08\x00\x00\x00w\x9c<!\xa2\x9a\xb9f'
其中vcan0是接口,[x]是有效负载中的字节数,其余是8字节的十六进制负载。
格式错误吗? PF_CAN是否已针对较新的Python版本进行了更新?当我应该将CAN_BCM用于我的协议族时,我是否使用CAN_RAW?或者我只是想知道如何解码解压缩的数据?
非常感谢任何方向或答案。
此外,这里有一些脚本输出到can-utils值我已经采摘。如果我找不到任何东西,我可能只是要收集大量数据,然后解码不能正确转换的数据字节。我觉得我过于复杂化,可能缺少一个关键方面。
Python3 output == can-utils/socketCAN (hex)
M= == 4D 3D
~3 == 7E 33
p == 70
. == 2E
@ == 40
r: == 0D 3A
c == 63
5g == 35 67
y == 79
a == 61
) == 29
E == 45
M == 4D
C == 43
P> == 50 3E
SGN == 53 47 4E
8 == 38
答案 0 :(得分:1)
不要费力地完成你开始的那个表,而只需查看任何ASCII代码表。当您只是打印一个字符串时,任何实际为ASCII文本的字符都将打印为该字符:只有不可打印的字符才会显示为十六进制转义。如果你想要十六进制的所有,你需要明确地要求:
import binascii
print(binascii.hexlify(data))
例如。
答案 1 :(得分:1)
我确定你已经遇到了python-can图书馆?如果不是,我们有一个本机python版本的socketcan,可以正确解析CAN消息中的数据。某些来源可能会帮助您 - 或者您可能想直接使用它。 CAN_RAW
可能就是您想要的,如果您打算将虚拟存储库留给您可能还需要的真实硬件get the timestamp from the hardware。
并非所有常量都已在Python的套接字模块中公开,因此还有一个ctypes版本,可以更容易地尝试使用socketcan广播管理器之类的东西。两者的文档都是here。