问题标签 [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.
python - 减少python-can中的抖动
我正在使用 python-can 来发送带有 VN16XX Vector 硬件的 can 帧,而不依赖于 CANoe(不需要许可,我们可以与没有安装 CANoe 的实体共享该工具)。
我现在正在运行的最简单的示例如下:
在这里,我使用 NtSetTimerResolution 来实现 500us 的计时器分辨率,如this answer中所述。
问题是:输出信号有抖动。外部示波器显示高达 ± 2 ms 的抖动,这对我的应用程序来说是不可接受的。
这里的问题:
-
- 如何减少输出帧的抖动?
-
- Vector 如何在输出帧上实现精确计时?我不认为 Vector 定时器依赖于外部硬件,因为我也可以创建定时器实例来发送没有连接 VN16xx 的 UART 帧,并且在这种情况下也不存在抖动。
-
- 也许它与python开销有关?切换到 Cython 会提供更好的性能吗?
韩国
python - 如何使用 python-can 模块测试程序
我正在实现一个使用can总线实例的类(总线实例是静态的,因为所有对象都应该使用相同的)。
此代码最终将在树莓上运行,因此可以在系统中正确设置 can 接口。
现在,如果我想对模块中的任何类方法或任何文件进行单元测试,总线会尝试初始化,并且由于我不在目标系统上,它会引发操作系统错误(这是意料之中的)。
文件夹结构如下:
我不清楚我应该如何测试这段代码。我尝试修补 can 模块:
我不明白我是否使用了错误的补丁装饰器,或者我的方法是否完全偏离了方向。我希望从导入的 can 模块中的每个类都使用模拟类mymodule
进行修补,但看起来不像。
python - Python-CAN 脚本接收一半的预期 CAN 消息
我使用 Python-CAN 库编写了一个 Python 脚本,该库以 1 秒的速率记录接收到的 CAN 消息 5 分钟,然后将所有消息记录到文件中并退出。计算机有一个连接到 CAN 总线的 CAN 模块。(总线上的另一个设备是引擎)我使用 SocketCAN 接口与它通信。
这台计算机连接的测试引擎系统正在以我认为 250kb 的波特率发送大约 114 条消息。我预计每 1 秒会在文件中记录 114 条消息,但我看到的却是大约一半。(约 65 条消息)
引擎的 ECU 是否有可能设置为 500kb 波特率,这就是为什么我没有得到我期望的计数?如果波特率不匹配,我认为不会有通信,但我没有对系统的物理访问权限,因为我是通过 OTA 更新远程发送脚本而不是自己运行它。(该设备是无头的,但设置为在启动时运行脚本)我只看到生成的日志文件。
这是python代码:
(注意,我有代码将接收到的消息解析为包含的信号,但我没有在此处包含此代码,因为它发生在最后,并且不相关)
我感谢您的任何想法或意见。谢谢
python - Tkinter 模块的线程/多处理问题
我正在尝试使用 tkinter 创建一个简单的 GUI 应用程序,该应用程序在按下按钮时运行三个测试脚本。我决定使用线程模块,因为我注意到 GUI 在尝试执行任何这些测试脚本(每个都是单独的 .py 文件)时会停止执行。此脚本中的每一个都使用 python CAN 模块,该模块在开始时有一个实例,允许脚本连接到 PCAN 设备
当我单独运行测试时,每个脚本都与 TKinter.py 应用程序同时运行并且 GUI 不会冻结,但是当我选择所有脚本一起运行时,每个脚本最终都会启动不同的线程,这会导致问题,因为我的 PCAN 设备一次只能为一个脚本初始化,如果我在相似的时间同时运行多个,结果最终会不准确。
我想知道是否有一种方法可以让 tkinter 应用程序在测试用例运行时不受影响地运行,但测试用例只能一个接一个地按顺序运行。
请注意,如果我使用线程中的 join 方法,GUI 仍然会因此停止响应。请帮忙。
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 倍。
让我知道在此之上的任何进一步信息。抱歉,我将无法共享跟踪文件,因为它是专有的,但有关其性质的任何详细信息我都可以回复。
linux-kernel - Canbus 冻结 - 如何忽略错误帧?
我正在尝试通过 can 与车辆控制单元 (VCU) 进行通信。我已经弄清楚了命令(索引、数据和频率),并且可以通过PCanView on Windows
. 现在我正在使用带有python-can
库的 Nvidia Xavier 系统来发送相同的命令,并且可以使用candump
. 但是,当我在发送这些命令时打开车辆引擎电源时,canbus 冻结(这是当 VCU 开始期待我发送的 can 命令时,如果它没有收到预期的数据,它将进入故障状态)
我过去曾成功使用 python-can 与其他 can 设备通信,我对代码本身的正确性充满信心。硬件连接也很好,因为我可以接收来自车辆的非 VCU 消息。重启canbus后也能收到VCU消息。
什么可能导致公共汽车冻结?有没有办法阻止它?(通过在 socket-can 层本身中设置一些配置?)
请注意,重新启动巴士并不能解决问题,因为车辆一旦出现故障就无法恢复,无需重新启动。
任何帮助将不胜感激!
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
python - Python-CAN / BLF 读取:是否可以向后读取日志文件?
我正在使用 Python CAN 在 BLF 文件中查找事件,特别是 J1939 TD 事件,因此我可以确定在哪个日志中发生了“真实世界”/车辆时间戳事件。
类似于以下内容:
但是,如果我想在日志中查找第一个和最后一个 TD 消息,我必须搜索整个日志“转发”才能找到最后一个 TD。由于某些日志文件有数百 MB,因此这有点耗时。
那么,是否可以反向读取日志文件?
例如
提前致谢
python-3.x - 汽车的 CAN-Bus PID 不能超过 256(十进制)python-can 模块错误
我目前正在开展一个项目,该项目涉及通过 OBDII 端口获取和解码我的 Scion FRS 的 Can-Bus 数据。我正在使用树莓派 4 和 PiCAN3 屏蔽来接收数据。我可以使用 Cansniffer can0 查看数据,但是,在 python3 程序中使用它是我遇到麻烦的地方。我遇到了值大于 256(十进制)的 PID 的问题,这给了我一个 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
python - 为什么 python-can bus.send() 方法发送混音消息?
我用 tshark 监控总线,在最简单的情况下,它看起来像一个截图
所以这是一个非常简单的用例:
我在接收端查了一下,两条发送的消息,都是可见的。
这是一个错误吗?或者它应该看起来像这样?