Reputation: 885
I want to create program that would emulate CAN port for testing purposes for another big application. Program should send previously recorded data through this virtual CAN. Anyone has any experience with such thing?
I'm thinking to establish virtual COM, and send through it data packed in CAN Frames. Could it work? And how could I establish virtual COM on linux? Found this thread Virtual Serial Port for Linux but sadly I don't get how could it be implemented into source code of program (beginner linux user and programmer under linux).
Would love to read your experience and suggestions.
Upvotes: 25
Views: 49541
Reputation: 96
Install the required dependencies:
sudo apt install net-tools iproute2 can-utils linux-modules-extra-$(uname -r)
You can use the following bash program to create a virtual CAN port (vcan) in Linux:
setup_vcan.sh
#!/bin/bash
# Using can1 as an example
CAN_PORT="can1"
sudo modprobe vcan
sudo ip link add dev $CAN_PORT type vcan
sudo ip link set up $CAN_PORT
Make the bash program executable:
chmod +x setup_vcan.sh
Run the bash program:
./setup_vcan.sh
Record the CAN messages into a log file (Replace $CAN_PORT
with the name of your CAN port):
candump -L $CAN_PORT > myfile.log
Playback the CAN messages from the log file:
canplayer -I myfile.log
You can verify the playback by checking the output of candump
:
candump $CAN_PORT
Instead of using canplayer
to read the recorded messages from a log file, we can use cansend
instead to send an arbitrary frame:
cansend $CAN_PORT 123#01A2B3C4
We can check the output of the specified frame in a more readable format using candump
:
candump $CAN_PORT
/lib/modules
Upvotes: 6
Reputation: 4849
You need SocketCAN driver, that is available on modern Linux distributions like Ubuntu etc. SocketCAN provides a virtual CAN port driver:
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
Now you can send and receive CAN frames over vcan0
device. Wikipedia article provides simple code example on how to use SocketCAN.
You'll also need can-utils for testing purposes.
You'll find more information about SocketCAN and its usage on eLinux.org
Upvotes: 56