CAN bus


CAN interface setup

There are different USB to CAN dongles available on the market, which usually support communicating with the Linux Kernel via a serial interface.

The following command creates a can0 interface from a dongle attached to /dev/ttyUSB0:

sudo slcan_attach /dev/ttyUSB0 -w

Afterwards, the interface has to be configured and started. Here we are setting the bit rate to 500 kbit/s:

sudo ip link set can0 type can bitrate 500000 restart-ms 500
sudo ip link set can0 up

If you want to see also your own messages, loopback mode has to be enabled before setting the interface up:

sudo ip link set can0 type can loopback on

Now, candump can be used to read all data available on the bus:

candump can0

Instead of an actual CAN device, also a virtual CAN device can be used on the Linux host:

sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

ISO-TP tools

The Linux kernel supports CAN ISO-TPopen in new window, which is used as the transport protocol for ThingSet.

Assuming a device with CAN address 1 is connected to the bus, the following command sets up an ISO-TP channel for messages from the device to the host computer (CAN address 0):

isotprecv -l -s 0x18000100 -d 0x18000001 can0

In order to request the node ID in binary mode from the device with address 1, run the following command:

echo "01 18 1D" | isotpsend -s 0x18000100 -d 0x18000001 can0

The same for text mode:

echo -n "?cNodeId" | hexdump -v -e '/1 "%02X "' | isotpsend -s 0x18000100 -d 0x18000001 can0

isotprecv only prints the hex values of the received data. The ASCII payload can be monitored using:

isotpsniffer -tA -f 2 -d 0x18000100 -s 0x18000001 can0