问题标签 [j1939]

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 投票
2 回答
2433 浏览

can-bus - J1939 与 CANBus

我知道 J1939 和 CANBus 之间的一般区别。比如ID位数。我也知道 J1939 可以让你发送 CANBus 不能做的超过 8 个字节。J1939 还提供 2 个节点之间的点对点通信。这个功能让我很困惑。在什么情况下,我们需要 2 个节点之间的点对点通信?而当其他节点继续广播时,这两个节点(进行点对点通信)不会错过广播的数据吗?另外在哪些情况下我们应该更喜欢使用 J1939 而不是 CANBus?而不是我们希望在一帧中使用 8 个字节的时间。

0 投票
1 回答
593 浏览

python - 发送 CAN J1939 消息

我想获得一个代码示例,以使用 Python 使用 J1939 堆栈发送简单的 CAN 消息。

以下网站有一个接收 J1939 消息的简单示例:https ://justkding.me/thoughts/python-sae-j1939-socket-support

此页面上的代码非常适合接收:

我一直在阅读文档,但似乎找不到在 Python 中发送 J1939 消息的简单方法。

这是对内核文档的参考:https ://www.kernel.org/doc/html/latest/networking/j1939.html

这是一个可能有用的 testj1939 的 C 实用程序代码:https ://github.com/linux-can/can-utils/blob/master/testj1939.c

有人可以发布一个简单的代码来使用 Python 中的 J1939 协议发送消息吗?任何显示如何正确执行此操作的文档将不胜感激。

谢谢你。

0 投票
2 回答
271 浏览

python - 在python中使用socketcan J1939过滤器

在 Python 中,我正在尝试使用 linux 内核文档中提到的 J1939 过滤:https ://www.kernel.org/doc/html/latest/networking/j1939.html

以下代码在 setsockopt() 行(设置过滤器)失败:

首先,内核文档提到使用 SOL_CAN_J1939 作为第一个参数。但是 socket.SOL_CAN_J1939 在 socket 包中不存在。所以查看这个位置的代码我能够理解这个 int 值应该是 107:http ://socket-can.996257.n3.nabble.com/RFC-v3-0-6-CAN-add-SAE -J1939-protocol-td7571.html

至于 setsockopt() 第三个参数,我打包过滤器以匹配 j1939_filter 结构(26 字节,如上一个链接的代码中所述)。这类似于在原始 CAN 的 can.interfaces.socketcan.utils 中所做的。

我做错了什么导致 setsockopt() 失败?

0 投票
0 回答
111 浏览

python - J1939传输协议的Python socketcan接口

在J1939协议中使用带有socketcan的python,似乎recvfrom()在数据超过8个字节时没有返回接口。在 J1939 协议中,当数据字节数超过 8 个时,会发送多个 CAN 报文,因为一条 CAN 报文最多只能容纳 8 个数据字节。

使用下面的程序,我看到接口返回 8 个数据字节,但不是 9 个数据字节。

是 Python 的问题还是内核的问题?如果这确实是一个错误,我们如何才能找到合适的开发人员?

谢谢你。

这是输出:

0 投票
0 回答
123 浏览

linux - 在linux中发送没有数据的CAN总线J1939消息

我需要使用 socketcan 发送一条没有数据的 CAN 总线 J1939 消息。消息需要发送无数据的原因是遵循规范 J1939-73 DM11 (PGN=0x00FED3)。

下面的 C 代码在发送长度至少为 1 字节的数据时可以正常工作。当 sizeof(dat) == 0 时,sendto() 函数根本不发送消息。我们可以用 来验证这一点candump vcan0

有什么方法可以使用 socket(PF_CAN, SOCK_DGRAM, CAN_J1939) 发送带有 0 字节数据的消息?它可以确认它可以使用套接字(AF_CAN,SOCK_RAW,CAN_RAW)在原始 CAN 中完成,但我需要它与 J1939 协议套接字一起使用。

我们如何联系内核开发人员提交错误/增强请求?

J1939 linux 内核文档可以在这里找到:https ://www.kernel.org/doc/html/v5.8/networking/j1939.html

谢谢你。

0 投票
1 回答
110 浏览

python-3.x - Python内置socket包升级

我的树莓派上安装了 python 3.7.1。我通过以下说明使用 pyenv 升级到 python 3.9.1:

https://yeti.co/blog/setting-up-a-raspberry-pi-with-raspbian-and-pyenv-running-python-35/

现在,我按照命令 python3 -V 运行 python 3.9.1,但是当我运行程序时出现错误,因为内置套接字包似乎没有升级到 3.9.1。我可以看到这一点,因为当我dir(socket)在 python3 中运行时,我缺少 3.9.1 套接字附加组件(名为 J1939)。

升级插座模块的方法是什么?由于它是一个内置包,我无法使用 pip3 对其进行升级。

谢谢你。

0 投票
1 回答
688 浏览

python - python-can J1939过滤掩码

我一直在使用 MCP2515 CAN 总线设备在 Raspberry 中使用 python 广播读取 J1939 消息的整个值。

我想过滤 J1939 消息,但我不明白 can-mask 的含义以及我如何发现它。在python-can的文档中说:

返回与至少一个过滤器匹配的所有消息。如果过滤器是 None 或零长度序列,则匹配所有消息。

即使我理解这个“无”部分,我也不明白如何识别我的 ID 消息的掩码

例子:

我只想通过脚本获取 ID 为“0xCF00400”和“0x18fee927”的消息

我应该如何填充每个变量以及如何确定 ID 的掩码?

更新 2021 年 3 月 10 日

我已经尝试了下面的代码,但仍然返回所有消息

输出:

0 投票
1 回答
308 浏览

python - 创建要由 J1939 DBC 解码的 MF4 - asammdf

我正在尝试创建一个 MF4 文件以由“J1939.dbc”解码,就像CSS 电子设备一样

我生成示例文件的代码是这样的:

图片上:

1)生成的文件是这个

2) CAN 日志记录被禁用 - 当我使用来自CSS 电子设备的文件时,“CAN 日志记录”被启用 -

在此处输入图像描述

但是如果尝试手动生成解码,它会返回一个空白文件

可能需要为解码指定 ID 和 DataByte 列,但我尝试了很多东西但没有工作。

我可以做什么 ?

0 投票
0 回答
34 浏览

codesys - J1939 - 雅马哈方向舵位置地址

使用 PCAN VIEW,我确定“方向舵位置”地址(Yamaha Outboard)为166792448,并使用 CAN_Rx_MessageProc_ST_0 从 8 字节数组的字节 4 和 5 获取舷外位置:

RUDDER_ANGLE_RAW := WORD_TO_INT((256*MESSAGE_RX_NMEA[5]) + MESSAGE_RX_NMEA[4]);

我假设这个地址会保持不变,但是当舷外机改变时,地址也改变了——新地址是166792453。此外,在电源循环后,地址再次更改为166792456

假设这与地址声明、冲突和地址更改有关。

我的问题(我试图掌握概念,但作为一个新手在这里挣扎)是这样的:

1 该地址是否存在一个范围?

2 我能否从接收到的 8 字节数据(例如“yamaha outboard”或制造商特定信息)中获取信息,以确定实际地址是什么?

如果有范围,我可以编写一个程序来扫描范围,查找制造商 ID,从而确定正确的地址。

任何帮助表示赞赏!

0 投票
1 回答
101 浏览

can-bus - J1939 - 我应该使用什么 PGN 号码来请求删除 NAME?

我有一个关于 J1939 的问题。我正在寻找请求删除 ECU 名称的 PGN 编号。

我为开源 SAE J1939 创建了一个库 https://github.com/DanielMartensson/Open-SAE-J1939

有两个 PGN 号码

PGN_ADDRESS_CLAIMED询问有关 ECU(名称)的信息,PGN_COMMANDED_ADDRESS而不是请求,更像是用于更改有关 ECU 及其目标地址的信息的命令。

问题:

在哪里可以找到可以删除ECU信息或断开ECU的PGN号?或者你认为我可以说PGN号可以是0xFFFFFF?我希望PGN已经被占用了?

我问的原因是因为当我更改 ECU 的地址和信息时,旧的信息和地址仍然存在......在其他 ECU 上可用。我的库就像所有 ECU 都具有关于所有 ECU:s 的相同信息一样工作。

如果你想知道我在做什么。我正在构建一个非常易于使用且易于理解的 J1939 库。我专注于最少的代码,库的目的是用户应该轻松实现自己的外部函数。

这是我的 J1939 库中的请求函数示例: