问题标签 [python-can]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
54 浏览

python - 减少python-can中的抖动

我正在使用 python-can 来发送带有 VN16XX Vector 硬件的 can 帧,而不依赖于 CANoe(不需要许可,我们可以与没有安装 CANoe 的实体共享该工具)。

我现在正在运行的最简单的示例如下:

在这里,我使用 NtSetTimerResolution 来实现 500us 的计时器分辨率,如this answer中所述。

问题是:输出信号有抖动。外部示波器显示高达 ± 2 ms 的抖动,这对我的应用程序来说是不可接受的。

这里的问题:

    • 如何减少输出帧的抖动?
    • Vector 如何在输出帧上实现精确计时?我不认为 Vector 定时器依赖于外部硬件,因为我也可以创建定时器实例来发送没有连接 VN16xx 的 UART 帧,并且在这种情况下也不存在抖动。
    • 也许它与python开销有关?切换到 Cython 会提供更好的性能吗?

韩国

0 投票
0 回答
32 浏览

python - 如何使用 python-can 模块测试程序

我正在实现一个使用can总线实例的类(总线实例是静态的,因为所有对象都应该使用相同的)。

此代码最终将在树莓上运行,因此可以在系统中正确设置 can 接口。

现在,如果我想对模块中的任何类方法或任何文件进行单元测试,总线会尝试初始化,并且由于我不在目标系统上,它会引发操作系统错误(这是意料之中的)。

文件夹结构如下:

我不清楚我应该如何测试这段代码。我尝试修补 can 模块:

我不明白我是否使用了错误的补丁装饰器,或者我的方法是否完全偏离了方向。我希望从导入的 can 模块中的每个类都使用模拟类mymodule进行修补,但看起来不像。

0 投票
1 回答
242 浏览

python - Python-CAN 脚本接收一半的预期 CAN 消息

我使用 Python-CAN 库编写了一个 Python 脚本,该库以 1 秒的速率记录接收到的 CAN 消息 5 分钟,然后将所有消息记录到文件中并退出。计算机有一个连接到 CAN 总线的 CAN 模块。(总线上的另一个设备是引擎)我使用 SocketCAN 接口与它通信。

这台计算机连接的测试引擎系统正在以我认为 250kb 的波特率发送大约 114 条消息。我预计每 1 秒会在文件中记录 114 条消息,但我看到的却是大约一半。(约 65 条消息)

引擎的 ECU 是否有可能设置为 500kb 波特率,这就是为什么我没有得到我期望的计数?如果波特率不匹配,我认为不会有通信,但我没有对系统的物理访问权限,因为我是通过 OTA 更新远程发送脚本而不是自己运行它。(该设备是无头的,但设置为在启动时运行脚本)我只看到生成的日志文件。

这是python代码:

(注意,我有代码将接收到的消息解析为包含的信号,但我没有在此处包含此代码,因为它发生在最后,并且不相关)

我感谢您的任何想法或意见。谢谢

0 投票
0 回答
36 浏览

python - Tkinter 模块的线程/多处理问题

我正在尝试使用 tkinter 创建一个简单的 GUI 应用程序,该应用程序在按下按钮时运行三个测试脚本。我决定使用线程模块,因为我注意到 GUI 在尝试执行任何这些测试脚本(每个都是单独的 .py 文件)时会停止执行。此脚本中的每一个都使用 python CAN 模块,该模块在开始时有一个实例,允许脚本连接到 PCAN 设备

当我单独运行测试时,每个脚本都与 TKinter.py 应用程序同时运行并且 GUI 不会冻结,但是当我选择所有脚本一起运行时,每个脚本最终都会启动不同的线程,这会导致问题,因为我的 PCAN 设备一次只能为一个脚本初始化,如果我在相似的时间同时运行多个,结果最终会不准确。

我想知道是否有一种方法可以让 tkinter 应用程序在测试用例运行时不受影响地运行,但测试用例只能一个接一个地按顺序运行。

请注意,如果我使用线程中的 join 方法,GUI 仍然会因此停止响应。请帮忙。

0 投票
0 回答
29 浏览

can-bus - 通过 python-can 通过 Vector 接口重播日志文件时收到 ERR_QUEUE_FULL 错误,但在使用 Vector CANoe 重播块时运行良好

上下文: 我正在尝试使用 python-can 通过带有 MessageSync 迭代器对象实现的向量接口重播 BLF 文件,并且 can.send 对产生的消息进行操作。虽然它按预期运行 20-30 秒,但之后它在发送 CAN 消息时不断引发 ERR_QUEUE_FULL 异常。已尝试使用 can_bus.flush_tx_buffer() 和 can_bus.reset() 处理该问题,但没有效果。我知道传输缓冲区已满,而消息在给定段写入太快导致缓冲区溢出。用法:

我正在使用 for 循环通过 msgSyncObj 进行迭代,并对消息使用 can.send() (假设消息不是错误帧)。考虑默认参数 gap(0.0001) 和 skip(60),在这种情况下,与重播文件相比,重播时间戳显着延迟。因此,在下一次尝试中包括作为 0 的间隙,以确保仅考虑偏移差异。它对齐重播时间戳,但会在几秒钟内导致缓冲区溢出。

在 Vector CANoe 重放块上运行时,相同的重放文件运行良好,在给定的重放持续时间(+10%)内没有任何缓冲区问题。

问题: 谁能阐明python-can和Vector CANoe(都在Win10 PC上运行)是否有不同的配置传输队列缓冲区的方式?任何关于如何增加 python-can 使用的传输队列缓冲区的建议以及处理此类缓冲区溢出(因为 flush_tx_buffer 没有任何影响)都受到高度赞赏。注意:在 Vector Hardware Configuration 中,传输队列大小配置为 256 条消息。在我想更改它之前,我不确定 python-can 是否使用相同的配置。

附加上下文 操作系统和版本:Win 10 Python 版本:Python 3 python-can 版本:3.3.4 python-can interface/s(如果适用):Vector VN1630

还有另一个用于确认 Tx 消息的真实 ECU。如果我在连续消息之间保持适当的等待时间(10 毫秒 - Python Windows 中的 time.sleep() 可以提供的最小值),这运行良好。缺点是使用等待时间注入,它需要实际重放时间的 6-7 倍。

让我知道在此之上的任何进一步信息。抱歉,我将无法共享跟踪文件,因为它是专有的,但有关其性质的任何详细信息我都可以回复。

0 投票
1 回答
36 浏览

linux-kernel - Canbus 冻结 - 如何忽略错误帧?

我正在尝试通过 can 与车辆控制单元 (VCU) 进行通信。我已经弄清楚了命令(索引、数据和频率),并且可以通过PCanView on Windows. 现在我正在使用带有python-can库的 Nvidia Xavier 系统来发送相同的命令,并且可以使用candump. 但是,当我在发送这些命令时打开车辆引擎电源时,canbus 冻结(这是当 VCU 开始期待我发送的 can 命令时,如果它没有收到预期的数据,它将进入故障状态)

我过去曾成功使用 python-can 与其他 can 设备通信,我对代码本身的正确性充满信心。硬件连接也很好,因为我可以接收来自车辆的非 VCU 消息。重启canbus后也能收到VCU消息。

什么可能导致公共汽车冻结?有没有办法阻止它?(通过在 socket-can 层本身中设置一些配置?)

请注意,重新启动巴士并不能解决问题,因为车辆一旦出现故障就无法恢复,无需重新启动。

任何帮助将不胜感激!

0 投票
0 回答
56 浏览

python - 如何释放 MCP2515 CAN 总线模块缓冲区中的空间?

我正在尝试对我的 ECU 进行一些诊断,为此,我需要每 50 毫秒发送一次特定消息。我正在使用 MCP2515 CAN BUS 模块和树莓派进行通信。问题是,当程序初始化时它工作正常。但片刻之后,它给出了错误"Transmit Buffer Full"。我试图通过将其txqueuelen增加到 20000 来修复它,但我仍然得到相同的响应。我什至尝试了bus.flush_tx_buffer我在网站上找到的命令,但它似乎不起作用。在过去的两周里,我一直在努力解决这个问题,并在互联网上到处搜索,找不到合适的解决方案。请帮我解决这个问题。我正在为这个项目使用 python-can 3.3.4 库。

这是我的代码:

这是我跑步时的反应ip -details -statistics link show can0

0 投票
0 回答
19 浏览

python - Python-CAN / BLF 读取:是否可以向后读取日志文件?

我正在使用 Python CAN 在 BLF 文件中查找事件,特别是 J1939 TD 事件,因此我可以确定在哪个日志中发生了“真实世界”/车辆时间戳事件。

类似于以下内容:

但是,如果我想在日志中查找第一个和最后一个 TD 消息,我必须搜索整个日志“转发”才能找到最后一个 TD。由于某些日志文件有数百 MB,因此这有点耗时。

那么,是否可以反向读取日志文件?

例如

提前致谢

0 投票
0 回答
22 浏览

python-3.x - 汽车的 CAN-Bus PID 不能超过 256(十进制)python-can 模块错误

我目前正在开展一个项目,该项目涉及通过 OBDII 端口获取和解码我的 Scion FRS 的 Can-Bus 数据。我正在使用树莓派 4 和 PiCAN3 屏蔽来接收数据。我可以使用 Cansniffer can0 查看数据,但是,在 python3 程序中使用它是我遇到麻烦的地方。我遇到了值大于 256(十进制)的 PI​​D 的问题,这给了我一个 python-can 模块错误:

self.data = 字节数组(数据)

ValueError: 字节必须在范围内 (0, 256)

(如果有人想要,我有完整错误的图片)

低于 256 的 PID 不会发生此问题,如 0C (Hex)。但是,我不能使用这些 PID,因为它们没有提供正确的数据。我对编码中的 CAN 总线数据和内存相当陌生,因此此时任何输入都会有所帮助。

谢谢大家的时间,如果您对代码或任何问题有任何疑问,请告诉我。

我试图开始工作的代码: https ://github.com/blupants/chupacarbrah

斯巴鲁 BRZ 的 PID 集: https ://forum.autosportlabs.com/viewtopic.php?t=5319

0 投票
0 回答
25 浏览

python - 为什么 python-can bus.send() 方法发送混音消息?

我用 tshark 监控总线,在最简单的情况下,它看起来像一个截图

终端截图

所以这是一个非常简单的用例:

我在接收端查了一下,两条发送的消息,都是可见的。

这是一个错误吗?或者它应该看起来像这样?