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 MathWorks virtual CAN channels connected in a loopback configuration.

Create a Receiving Channel

Create a CAN channel usingcanChannelto receive messages by specifying the vendor name, device name, and device channel index.

rxCh = canChannel("MathWorks","Virtual 1", 2);

Inspect the Channel

Use thegetcommand to obtain more detailed information on all channel properties and their current values.

get(rxCh)
ArbitrationBusSpeed: [] DataBusSpeed:[]接收rorCount: 0 TransmitErrorCount: 0 InitializationAccess: 1 InitialTimestamp: [0x0 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 thestartcommand to set the channel online.

start(rxCh);

Transmit Messages

The example functiongenerateMsgscreates CAN messages usingcanMessageand transmits them usingtransmitat various periodic rates. It generates traffic on the CAN bus for demonstration purposes.

typegenerateMsgs
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 thegenerateMsgsfunction to transmit messages for the example.

generateMsgs();

Receive Messages

OncegenerateMsgscompletes, receive all available messages from the channel using thereceivefunction.

rxMsg = receive(rxCh, Inf,"OutputFormat","timetable");

Useheadto extract the first few rows of received messages for preview.

head(rxMsg)
ans=8×8 timetableTime ID Extended Name Data Length Signals Error Remote ___________ ___ ________ __________ ___________________ ______ ____________ _____ ______ 0.11087 sec 100 false {0x0 char} {1x0 uint8 } 0 {0x0 struct} false false 0.11088 sec 200 false {0x0 char} {[ 0 0]} 2 {0x0 struct} false false 0.11089 sec 400 false {0x0 char} {[ 0 0 0 0]} 4 {0x0 struct} false false 0.11089 sec 600 false {0x0 char} {[ 0 0 0 0 0 0]} 6 {0x0 struct} false false 0.11089 sec 800 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false 0.13588 sec 800 false {0x0 char} {[1 1 1 1 1 1 1 1]} 8 {0x0 struct} false false 0.16088 sec 600 false {0x0 char} {[ 1 1 1 1 1 1]} 6 {0x0 struct} false false 0.16088 sec 800 false {0x0 char} {[1 1 1 1 1 1 1 1]} 8 {0x0 struct} false false

Stop the Channel

Use thestopcommand to set the channel offline.

stop(rxCh);

分析接收到的消息

MATLAB provides a powerful environment for performing analysis on CAN messages. Theplotcommand 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")

Figure contains an axes object. The axes object contains an object of type line.