首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RAW CAN解码

RAW CAN解码
EN

Stack Overflow用户
提问于 2017-11-02 19:21:41
回答 2查看 2.3K关注 0票数 1

我试图使用虚拟的CAN网络导入CAN数据,当我打开我的CAN数据包时,会得到奇怪的结果。我正在使用Python 3.3.7

代码:导入套接字,sys,struct

代码语言:javascript
运行
复制
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)

所以当我有这样一个罐头包的时候。

代码语言:javascript
运行
复制
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值。如果我找不到任何东西,我可能只需要收集大量数据,然后对无法正确转换的数据字节进行解码。我觉得我已经把事情复杂化了,而且可能遗漏了一个关键的方面。

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-05 18:18:43

与其费力地完成启动的表,不如看看任何ASCII代码图表。当您只打印一个字符串时,任何实际上是ASCII文本的字符都会作为该字符打印:只有不可打印的字符才会显示为十六进制转义。如果要以十六进制表示所有内容,则需要显式地请求:

代码语言:javascript
运行
复制
import binascii

print(binascii.hexlify(data))

例如。

票数 1
EN

Stack Overflow用户

发布于 2018-02-17 04:08:36

我肯定你已经进入了python-罐库了?如果不是,我们有一个本地python版本的socketcan,它可以正确地解析CAN消息中的数据。一些源可能会帮助您--或者您可能希望直接使用它。CAN_RAW可能是您想要的,如果您计划将虚拟罐留给真正的硬件,您可能也想要从硬件中获取时间戳

并不是所有的常量都在Python的套接字模块中公开,所以还有一个ctype版本,它可以更容易地实验诸如socketcan广播管理器之类的东西。两者的文档都是这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47083099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档