我正在尝试使用canplayer重播一些candump文件,但没有成功.当我尝试运行canplayer时,它只是执行并返回,不知道发生了什么.
我到目前为止所做的尝试:
设置1
设置2
我在两台运行Ubuntu 12.04的不同机器上尝试过这些测试,结果相同.
你知道它可能是什么原因吗?
如何创建多个虚拟套接字并将它们链接在一起以创建虚拟总线?
我想模拟一个应用程序,其中许多节点通过CAN相互通信.
我正在运行一个带有两个 CAN 通道的程序(使用 TowerTech CAN Cape TT3201)。
两个通道是 can0 (500k) 和 can1 (125k)。can0 通道工作正常,但 can1 运行写入:无可用缓冲区空间错误。
我正在使用 ValueCAN3/VehicleSpy 来检查消息。
这是在我运行程序之前。can0 和 can1 似乎都发送,但在 VehicleSpy 中只显示 can0。
root@cantool:~# cansend can0 100#00
root@cantool:~# cansend can1 100#20
Run Code Online (Sandbox Code Playgroud)
这是在我尝试运行程序之后
root@cantool:~# cansend can1 100#20
write: No buffer space available
root@cantool:~# cansend can0 111#10
Run Code Online (Sandbox Code Playgroud)
当我的程序正在运行时:对于要在 can1 上发送的所有消息,我收到此错误
2016-11-02 15:36:03,052 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 12f83018 010 1 00
2016-11-02 15:36:03,131 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 0af81118 010 6 …Run Code Online (Sandbox Code Playgroud) 我正在尝试过滤具有某些 ID 的 CAN 帧,如下所述:https: //landlock.io/linux-doc/landlock-v8/networking/can.html#raw-protocol-sockets-with-can-filters-sock -生的
我的部分代码:
struct can_filter rfilter[4];
if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
fprintf(stderr, "Error while opening socket.\n");
exit(EXIT_FAILURE);
}
rfilter[0].can_id = 0x0D6 | CAN_INV_FILTER;
rfilter[0].can_mask = CAN_SFF_MASK;
rfilter[1].can_id = 0x0D8 | CAN_INV_FILTER;
rfilter[1].can_mask = CAN_SFF_MASK;
rfilter[2].can_id = 0x0E4 | CAN_INV_FILTER;
rfilter[2].can_mask = CAN_SFF_MASK;
rfilter[3].can_id = 0x77F | CAN_INV_FILTER;
rfilter[3].can_mask = CAN_SFF_MASK;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
Run Code Online (Sandbox Code Playgroud)
如果我只使用四个过滤器之一并注释掉其他三个,它就会按预期工作。如果我使用所有四个过滤器,它根本不起作用。在这种情况下,我仍然可以接收 CANbus 接口上的所有内容。
所以,我的猜测是我的过滤器以某种方式相互抵消了?!我需要更改什么才能过滤 CAN ID 0x0D6、0x0D8、0x0E4 和 0x77F?
简而言之,我希望candump只向我显示ID为0x00200200或0x255的帧.
所以我这样做:
candump can0,00200200:0,255:0
Run Code Online (Sandbox Code Playgroud)
但这会给出所有帧,每帧显示两次.即输出:
cansend can0 256#112233
Run Code Online (Sandbox Code Playgroud)
会是这样的:
can0 256 [3] 11 22 33
can0 256 [3] 11 22 33
Run Code Online (Sandbox Code Playgroud)
除了过滤器不像我预期的那样并且通过0x256之外,它显示两次的事实表明这些帧实际上是由两个滤波器匹配的,这对我来说更没意义.任何人都可以解释为什么会这样,也许可以告诉我正确的方法吗?
我想用 C++ 读取我的 socketcan 套接字当前配置的 CAN 比特率。
我可以通过以下方式查看比特率ip -det link show can0:
9: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
link/can promiscuity 0
can state ERROR-ACTIVE restart-ms 100
bitrate 1000000 sample-point 0.750
tq 125 prop-seg 2 phase-seg1 3 phase-seg2 2 sjw 1
pcan_usb: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1
clock 8000000
Run Code Online (Sandbox Code Playgroud)
比特率通过设置/etc/network/interfaces,但用户可以手动更改它。
libsocketcan 似乎只支持设置比特率,但不支持读取比特率。
如何使用libnetlink读取相应的属性?或者还有另一种读取当前比特率的方法吗?
我在嵌入式 Linux 上使用Flexcan 驱动程序,并且有C程序控制 CAN 消息。在我的C程序中,我需要检查 can 总线的状态,例如buss-off或error-active。我可以使用 linux 命令,
ip -details -statistics link show can0结果如下:
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
link/can promiscuity 0
can state *ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100
bitrate 250000 sample-point 0.866
tq 266 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1
flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 …Run Code Online (Sandbox Code Playgroud) 我已经设置了两个 vcan 设备,我想将它们视为连接在一起。我希望能够使用 can-utils candump 在一行上侦听,并从另一行发送 can 消息。没有物理设备我怎么能做到这一点?
为了澄清起见,我正在编写软件来通过我已经能够进行的 CAN 通信,但为了促进实际数据收集和进一步开发,我需要两个启用了 CAN 的设备相互通信。虽然现实世界中的一个简单解决方案是通过将设备物理连接在一起来解决的,但我需要一个可以在计算机上运行的程序化解决方案。
我已经从 SVN 下载了 can 实用程序。因为默认情况下,can 实用程序不在内核中。
svn checkout svn://svn.berlios.de/socketcan/trunk/can-utils
Run Code Online (Sandbox Code Playgroud)
我使用的内核是:--
ignite@ignite:~/socketcan/can-utils$ uname -a
Linux ignite 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:32:08 UTC 2012 i686 i686 i686 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
然后我重新编译了实用程序。这是找不到错误 isotp.h :---
ignite@ignite:~/socketcan/can-utils$ make all
cc -O2 -Wall -Wno-parentheses -I../kernel/2.6/include -fno-strict-aliasing -DSO_RXQ_OVFL=40 -DPF_CAN=29 -DAF_CAN=PF_CAN isotprecv.c -o isotprecv
isotprecv.c:60:29: fatal error: linux/can/isotp.h: No such file or directory
compilation terminated.
make: *** [isotprecv] Error 1
cc -O2 -Wall -Wno-parentheses -I../kernel/2.6/include -fno-strict-aliasing -DSO_RXQ_OVFL=40 -DPF_CAN=29 -DAF_CAN=PF_CAN isotpsend.c -o isotpsend
isotpsend.c:60:29: fatal error: linux/can/isotp.h: No such …Run Code Online (Sandbox Code Playgroud) 我一直在使用 SocketCAN,尤其是 Virtual CAN vcan 已经有一段时间了。但是,到目前为止,我从未使用过 CAN FD(灵活数据速率)。
好吧,我今天早上使用 can-utils 尝试了它:
cansend vcan0 123##122
Run Code Online (Sandbox Code Playgroud)
但是,我得到了“CAN 接口不支持 CAN FD”的响应。已使用以下终端命令创建了 vcan 接口:
ip link add dev vcan0 type vcan
ip link set up vcan0
Run Code Online (Sandbox Code Playgroud)
有人知道vcan是否支持CAN FD吗?如果是,如何设置支持 CAN FD 的 vcan 接口?
系统配置:VirtualBox 上的 Ubuntu 14.04.1。
提前致谢,MAW
我是 CAN 协议的新手,我正在尝试通过 Linux 的 SocketCAN 使用它。然而,我对可用的 2 种不同的 CAN 套接字(RAW 和广播管理器 (BCM))感到困惑。
文档指出,BCM 套接字不适用于发送单独的 CAN 帧。直觉上我猜测 BCM 更适合单主多从配置,但这似乎有些错误。
BCM 的用途是什么?或者说,它们之间的功能有什么区别?在什么情况下我会选择使用广播管理器而不是原始套接字?
我试图通过套接字发送 29 位 EFF CAN 消息,但由于某种原因,它使用 11 位标识符发送它们,从 ID 中删除 5 个字节。使用环回模式,通过 candump 我可以看到消息以 11 位形式接收。
我没有收到任何错误,什么也没有,这就是我感到困惑的原因
我正在使用树莓派 3b+,如果这有什么区别的话。和 Can-utils 库。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <net/if.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include </home/pi/can-utils/lib.h>
int main(int argc, char **argv)
{
int s,loop = 1;
int nbytes;
struct sockaddr_can addr;
struct can_frame frame;
struct ifreq ifr;
//can interface
if((s=socket(PF_CAN, SOCK_RAW, CAN_RAW))<0){
perror("socket");
return 1;
}
strcpy(ifr.ifr_name, "can0");
if(ioctl(s, SIOCGIFINDEX, &ifr) …Run Code Online (Sandbox Code Playgroud)