我试图使用虚拟的CAN网络导入CAN数据,当我打开我的CAN数据包时,会得到奇怪的结果。我正在使用Python 3.3.7
代码:导入套接字,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)
所以当我有这样一个罐头包的时候。
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_RAW时,我是否使用了CAN_BCM?还是我错过了如何解码未打包的数据?
任何方向或回答都将不胜感激。
另外,这里还有一些脚本输出给我已经提取的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
发布于 2017-11-05 18:18:43
与其费力地完成启动的表,不如看看任何ASCII代码图表。当您只打印一个字符串时,任何实际上是ASCII文本的字符都会作为该字符打印:只有不可打印的字符才会显示为十六进制转义。如果要以十六进制表示所有内容,则需要显式地请求:
import binascii
print(binascii.hexlify(data))
例如。
https://stackoverflow.com/questions/47083099
复制相似问题