Main Content

Get Started with CAN Communication in MATLAB

This example shows you how to use CAN channels to transmit and receive CAN messages. It uses bat365® 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("bat365", "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: 'bat365'
               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 bat365, 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('bat365', '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")