问题标签 [socketcan]

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 投票
1 回答
825 浏览

linux-device-driver - 套接字如何获得发送失败状态?

众所周知,在CAN总线通信协议中,发送方知道数据是否发送成功。我发送socketcan数据如下。

但是即使CAN通讯线断开了,ret的返回值仍然是16(=sizeof(struct can_frame))。我查询了资料,发现问题出在socketcan使用的网络栈的tx_queue上。多次调用write时,缓冲区已满,ret的返回值为-1。但这不是我所期望的行为,我希望发送的每一帧数据都会立即获得成功或失败的状态。经过

我想取消 tx_queue,但它不起作用。我想问的是,有没有办法取消socketcan的tx_queue,或者通过API(如libsocketcan)获取关于控制器的每个发送帧的状态。谢谢。

0 投票
1 回答
466 浏览

socketcan - SocketCAN:read() 函数永远不会返回

我正在开发一个需要在 CAN 总线上读写消息的定制嵌入式 Linux 系统。SocketCAN 被用来完成这个。

CAN 接口 can0 在引导时启动,波特率设置为 500 kbps。我正在使用 CANoe、cangen 和 candump 来测试消息的接收和传输。当 CANoe 设置为向嵌入式系统发送消息时,candump 在嵌入式系统上读取这些消息是没有问题的。当 cangen 设置为发送消息时,CANoe 从嵌入式系统读取消息没有问题。

我编写了一个小程序,使用 read() 函数从 can0 接口读取消息。当调用 read() 函数来读取单个 CAN 消息时,函数会阻塞,然后永远不会返回。我确信 CAN 接口正在接收数据,因为 ifconfig 报告的接收字节数按预期增加。与我的程序同时运行 candump 还显示接口正在从总线接收 CAN 消息。下面是打开和读取CAN接口的相关代码。已省略错误检查。

打开插座:

读取套接字:

我是否在代码中遗漏了某些内容或做错了什么?有没有其他人遇到过这个问题并找到了解决方案?

0 投票
0 回答
158 浏览

linux-device-driver - 如何在 linux 设备驱动程序中接收 CAN 数据?

我想读取 CAN 总线并从 CAN 总线上的特定设备获取数据。我之前使用用户空间(sys/socket)中可用的 Socket 通信 api 实现了这一点。我现在有类似的要求,但这次是在内核空间中工作的设备驱动程序上工作。我想相同的套接字通信在内核空间中不可用,这就是为什么我猜我无法使用 #include 编译内核模块。

我想出的一种方法是创建一个用于设备创建的设备驱动程序和一个支持的用户空间程序来交互它并通过使用套接字通信提供 CAN 数据。如果有更好的方法请给我建议。

0 投票
0 回答
58 浏览

sockets - 以太网帧的时间戳

我正在接收 CAN 和以太网消息,我想根据时间戳比较它们。我正在使用套接字 CAN 和“ioctl(s, SIOCGSTAMP, &tv);” 获取can帧时间戳的函数,它工作得很好;s是can的套接字,但是当我将它用于以太网帧时,它有时会给出一个负值,但更重要的是每个时间戳都是相同的,可能有什么问题?

0 投票
0 回答
302 浏览

python - 虚拟 CAN 总线模拟器在 Ubuntu 上不起作用

我正在尝试使用以下代码重播日志文件。从文件中读取每个信号并创建命令是一个非常简单的代码。它正在正确创建命令。我打印它进行检查,它工作正常,但是当我 os.system(command)用来模拟 VCAN 时它会冻结并且不会在终端上显示命令。

我在我的 Mac 上使用 Ubuntu 64 位 (vmWare)。此代码在 Raspberry Pi 上运行良好。我安装了以下内容: Socketcanandsudo apt-get install can-utilspip3 install cantools. 我带来了虚拟罐接口

为了测试界面,当我把它cansend vcan0 123#1122334455667788放在命令行上时,不会给我任何错误。所以可能有问题os.system(command),尽管我通过发送其他命令进行了检查。我想知道我是否错过了安装任何其他库以便在 Ubuntu (vmWare) 上使用它。

任何帮助都会很棒。谢谢

0 投票
1 回答
167 浏览

python - 如何编写命令以生成特定格式的 canbus 数据?

我正在编写一个 python 程序来生成以下格式的 canbus 数据。

<0x18eeff01> [8] 05 a0 be 1c 00 a0 a0 c0

我为此使用 python-can 库并尝试读取上述消息格式。我无法弄清楚 <0x18eeff01> 表示的第一种格式是什么?我不知道我将如何在输出中产生它。

0 投票
1 回答
323 浏览

socketcan - 在 can 和 vcan 之间切换

我已阅读文档并且知道:

要启用一个真正的你能做到

并启用你做的vcan

就我而言,我什至在启用之前禁用 vcan

我的问题是相反的情况如何?(从 can 到 vcan)?如果我的 can up ,我应该在启用 vcan 之前禁用它吗?如何?并且还启用 vcanadd不使用set...为什么?

0 投票
2 回答
466 浏览

c - recvmsg 的 Linux SocketCAN 行为

我正在编写一个 CAN 记录器程序。我记录数据的方式类似于candump调用时 -tool的candump方式candump anyhttps ://github.com/linux-can/can-utils/blob/master/candump.c

candump anycandump绑定到任何设备,即它addr.can_ifindex = 0;用于recvmsg获取 CAN 帧,然后它获取struct msghdr msg;附加时间戳以将其写入日志文件或屏幕上。

我的问题是,内核是否确保以下assert内容始终有效?

对 SocketCAN 驱动程序中的源代码位置的提示也会有所帮助。

0 投票
1 回答
92 浏览

netty - 使用 Nettys epoll 实现 Linux SocketCAN 通信

我正在考虑使用 Netty 作为JavaCAN库的基础,因为它还使用 NIO/epoll 来访问 Linux SocketCAN

令我困扰的是,Netty epoll 类是为网络(IP)通信而编写的,而不是为了使用没有任何 IP 关系的 Linux 套接字。

即使AbstractEpollChannel是使用LinuxSocket已经依赖于InetAddressIP 通信的那个。

我想要实现的是一个Channel利用 Netty epoll 实现但没有 IP 通信的,只是一个 Linux 套接字。

无论您认为这是可能的还是一个坏主意,我都喜欢听听意见?

0 投票
2 回答
314 浏览

raspberry-pi - RPI/Raspbian SocketCAN 配置问题

Python 和 RPi n00b 在这里。试图让 CANopen 在我的 RPI 上工作,并认为我已经完成了 8/10 的通信方式。

目标设备是一个 RPi 3+,安装了 Raspbian Buster 和 5.4.51-v7+ linux 内核,连接到 Kvaser Leaf USB CANopen 适配器。众所周知,CANopen 适配器硬件很好,可以很好地与 Windows 软件配合使用。

相关信息: - 已安装 can-utils - 已安装 python-can 4.0.0 -
似乎已成功安装 Kvaser 驱动程序(最终使 make 完成且没有错误) - vcan 似乎工作正常 - 已使用此方便成功传输和接收测试数据包使用 can-utils 的虚拟 can 适配器

我最初可以设置罐头插座:

但是当我尝试初始化实际硬件时,它会失败并出现以下错误:

显然我错过了一些东西,但无法弄清楚是什么。我注意到其他人也有类似的问题(尽管硬件不同)。请告知解决方案和 TIA。