Get Started with CAN Communication in MATLAB
This example shows you how to use CAN channels to transmit and receive CAN messages. It uses MathWorks® virtual CAN channels connected in a loopback configuration.
Create a Receiving Channel
Create a CAN channel using canChannel
to receive messages by specifying the vendor name, device name, and device channel index.
rxCh = canChannel("MathWorks", "Virtual 1", 2);
Inspect the Channel
Use the get
command to obtain more detailed information on all channel properties and their current values.
get(rxCh)
ArbitrationBusSpeed: [] DataBusSpeed: [] ReceiveErrorCount: 0 TransmitErrorCount: 0 InitializationAccess: 1 InitialTimestamp: [0×0 datetime] SilentMode: 0 TransceiverState: 'N/A' BusSpeed: 500000 NumOfSamples: [] SJW: [] TSEG1: [] TSEG2: [] BusStatus: 'N/A' TransceiverName: 'N/A' Database: [] MessageReceivedFcn: [] MessageReceivedFcnCount: 1 UserData: [] FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All' MessagesReceived: 0 MessagesTransmitted: 0 Running: 0 Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 DeviceVendor: 'MathWorks' ProtocolMode: 'CAN' MessagesAvailable: 0
Start the Channel
Use the start
command to set the channel online.
start(rxCh);
Transmit Messages
The example function generateMsgs
creates CAN messages using canMessage
and transmits them using transmit
at various periodic rates. It generates traffic on the CAN bus for demonstration purposes.
type generateMsgs
function generateMsgs() % generateMsgs Creates and transmits CAN messages for demo purposes. % % generateMsgs periodically transmits multiple CAN messages at various % periodic rates with changing message data. % % Copyright 2008-2016 The MathWorks, Inc. % Create the messages to send using the canMessage function. The % identifier, an indication of standard or extended type, and the data % length is given for each message. msgTx100 = canMessage(100, false, 0); msgTx200 = canMessage(200, false, 2); msgTx400 = canMessage(400, false, 4); msgTx600 = canMessage(600, false, 6); msgTx800 = canMessage(800, false, 8); % Create a CAN channel on which to transmit. txCh = canChannel('MathWorks', 'Virtual 1', 1); % Register each message on the channel at a specified periodic rate. transmitPeriodic(txCh, msgTx100, 'On', 0.500); transmitPeriodic(txCh, msgTx200, 'On', 0.250); transmitPeriodic(txCh, msgTx400, 'On', 0.125); transmitPeriodic(txCh, msgTx600, 'On', 0.050); transmitPeriodic(txCh, msgTx800, 'On', 0.025); % Start the CAN channel. start(txCh); % Run for several seconds incrementing the message data regularly. for ii = 1:50 % Increment the message data bytes. msgTx200.Data = msgTx200.Data + 1; msgTx400.Data = msgTx400.Data + 1; msgTx600.Data = msgTx600.Data + 1; msgTx800.Data = msgTx800.Data + 1; % Wait for a time period. pause(0.100); end % Stop the CAN channel. stop(txCh); end
Run the generateMsgs
function to transmit messages for the example.
generateMsgs();
Receive Messages
When generateMsgs
completes, receive all available messages from the channel using the receive
function.
rxMsg = receive(rxCh, Inf, "OutputFormat", "timetable");
Use head
to extract the first few rows of received messages for preview.
head(rxMsg)
Time ID Extended Name Data Length Signals Error Remote ___________ ___ ________ __________ ___________________ ______ ____________ _____ ______ 0.31722 sec 100 false {0×0 char} {1×0 uint8 } 0 {0×0 struct} false false 0.31723 sec 200 false {0×0 char} {[ 0 0]} 2 {0×0 struct} false false 0.31723 sec 400 false {0×0 char} {[ 0 0 0 0]} 4 {0×0 struct} false false 0.31723 sec 600 false {0×0 char} {[ 0 0 0 0 0 0]} 6 {0×0 struct} false false 0.31723 sec 800 false {0×0 char} {[0 0 0 0 0 0 0 0]} 8 {0×0 struct} false false 0.34689 sec 800 false {0×0 char} {[1 1 1 1 1 1 1 1]} 8 {0×0 struct} false false 0.37728 sec 600 false {0×0 char} {[ 1 1 1 1 1 1]} 6 {0×0 struct} false false 0.37729 sec 800 false {0×0 char} {[1 1 1 1 1 1 1 1]} 8 {0×0 struct} false false
Stop the Channel
Use the stop
command to set the channel offline.
stop(rxCh);
Analyze Received Messages
MATLAB® provides a powerful environment for performing analysis on CAN messages. The plot
command can create a scatter plot with message timestamps and identifiers to provide an overview of when certain messages occurred on the network.
plot(rxMsg.Time, rxMsg.ID, "x") ylim([0 2047]) xlabel("Timestamp") ylabel("CAN Identifier")