www.gusucode.com > vnt 源码程序 matlab案例代码 > vnt/demoVNT_FilteringCANMessages.m
%% CAN Channel Message Filtering % This example shows you how to use CAN message filters to allow % only messages that contain specified identifiers to pass through a % channel. It uses Vector Virtual CAN channels connected in a loopback % configuration. % % Copyright 2009-2014 The MathWorks, Inc. %% Create Transmitting and Receiving Channels % One channel will transmit messages the other. Filters are set on the % receiving channel. txCh = canChannel('Vector', 'Virtual 1', 1); rxCh = canChannel('Vector', 'Virtual 1', 2); %% Create Messages % These messages are sent to the receiving channel multiple times % throughout the example. Note that one of the messages has an % extended identifier. txMsgs(1) = canMessage(250, false, 8); txMsgs(2) = canMessage(500, false, 8); txMsgs(3) = canMessage(1000, false, 8); txMsgs(4) = canMessage(1500, true, 8); txMsgs(5) = canMessage(2000, false, 8); %% Receive Messages on an Open Filter % Set the channels online, transmit the messages, and receive them. Note % that all messages sent were received. The filter settings on a newly % created channel are fully open for both standard and extended identifiers. start(rxCh); start(txCh); transmit(txCh, txMsgs); pause(0.5); rxMsgs1 = receive(rxCh, Inf) stop(rxCh); stop(txCh); %% % Plot the identifiers of the received messages to see that all % messages sent were received by the channel. plot(1, [rxMsgs1.ID], '.') h_gca = gca; h_gca.XTick = 0:1:2; h_gca.XTickLabel = {'', 'Transmit 1', ''}; axis([0 2 0 2047]) xlabel('Message Transmits') ylabel('CAN Identifiers') %% Receive Messages on a Configured Filter % Use the |filterAllowOnly| command to specify messages to receive by CAN % identifier and identifier type. filterAllowOnly(rxCh, [500 2000], 'Standard'); %% % Display the channel to view the configured state of the message filters. rxCh %% % Transmit the messages again to the receiving channel. Note that fewer % messages were received this time. start(rxCh); start(txCh); transmit(txCh, txMsgs); pause(0.5); rxMsgs2 = receive(rxCh, Inf) stop(rxCh); stop(txCh); %% % Add the new receive data to the plot to see which messages are blocked % by the filter. The message with the extended identifier was % numerically supposed to be blocked, but it passed the filter because the % filter was only configured for standard identifiers. plot(1, [rxMsgs1.ID], '.', 2, [rxMsgs2.ID], '.'); h_gca = gca; h_gca.XTick = 0:1:3; h_gca.XTickLabel = {'', 'Transmit 1', 'Transmit 2', ''}; axis([0 3 0 2047]) xlabel('Message Transmits') ylabel('CAN Identifiers') %% Reset the Message Filter % You can reset the message filters to their default open state with the % |filterAllowAll| command. filterAllowAll(rxCh, 'Standard'); %% % Display the channel to view the configured state of the message filters. rxCh %% % Transmit and receive a third time to see that all messages are % once again passing through the filter and into the channel. start(rxCh); start(txCh); transmit(txCh, txMsgs); pause(0.5); rxMsgs3 = receive(rxCh, Inf) stop(rxCh); stop(txCh); %% % With the new data added to the plot, observe that the first and third % transmits are identical as the message filters were fully open in both % cases. plot(1, [rxMsgs1.ID], '.', 2, [rxMsgs2.ID], '.', 3, [rxMsgs3.ID], '.') h_gca = gca; h_gca.XTick = 0:1:4; h_gca.XTickLabel = {'', 'Transmit 1', 'Transmit 2', 'Transmit 3', ''}; axis([0 4 0 2047]) xlabel('Message Transmits') ylabel('CAN Identifiers') %% Filter Messages By Name % The |filterAllowOnly| command can also reference messages by name when % using a CAN database file. db = canDatabase('demoVNT_CANdbFiles.dbc'); rxCh.Database = db; filterAllowOnly(rxCh, 'EngineMsg'); rxCh %% Blocking All Messages of a Specific Type % The |filterBlockAll| command lets you quickly set the filter to block all % messages of either standard or extended identifier type. filterBlockAll(rxCh, 'Extended'); rxCh