Используйте функции обратного вызова приема сообщения в коммуникации CAN

Этот пример показывает вам, как использовать функцию обратного вызова, чтобы обработать сообщения, полученные от канала CAN. Это использует MathWorks виртуальные каналы CAN, соединенные в петлевой настройке. Этот пример описывает рабочий процесс для сети CAN, но концепция, продемонстрированная также, применяется к сети CAN FD.

Создайте канал получения

Создайте канал CAN с помощью canChannel чтобы получить сообщения путем определения имени поставщика, имя устройства и устройство образовывают канал индекс.

rxCh = canChannel("MathWorks", "Virtual 1", 2)
rxCh = 
  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 2
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: [0x0 datetime]
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 500000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []

Сконфигурируйте функцию обратного вызова

Установите функцию обратного вызова запускаться, когда необходимое количество сообщений будет доступно на канале.

rxCh.MessageReceivedFcn = @receivingFcn;

Сконфигурируйте сообщение полученное количество

Задайте количество сообщений, требуемых в канале, прежде чем функция обратного вызова будет инициирована.

rxCh.MessageReceivedFcnCount = 30;

Реализуйте функцию обратного вызова

Функция обратного вызова в качестве примера получает все доступные сообщения от канала и строит идентификаторы CAN против их меток времени на каждом выполнении.

type receivingFcn
function receivingFcn(rxCh)
% RECEIVINGFCN A CAN channel message receive callback function.
%
%   This is a callback function used to receive CAN message. It receives 
%   messages from the channel RXCH and plots the result.
%

% Copyright 2009-2016 The MathWorks, Inc.

    % Receive all available messages.
    rxMsg = receive(rxCh, Inf, 'OutputFormat', 'timetable');

    % Plot the signal values against their message timestamps.
    plot(rxMsg.Time, rxMsg.ID, 'x');
    ylim([0 2047])
    xlabel('Timestamp');
    ylabel('CAN Identifier');
    hold all;
end

Запустите канал

Используйте start команда, чтобы установить канал онлайн.

start(rxCh);

Выполните функцию обратного вызова

Функциональный generateMsgs создает сообщения CAN и передает их на различных периодических уровнях, чтобы создать трафик на шине CAN. Когда сообщения передаются, функция обратного вызова выполняет каждый раз порог, заданный свойством MessageReceivedFcnCount соответствуется.

generateMsgs();

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

Смотрите остающиеся сообщения

Отобразите MessagesAvailable свойство канала видеть количество остающихся сообщений. Поскольку доступное количество сообщения ниже заданного порога, больше сообщений требуется, чтобы инициировать коллбэк другое время.

rxCh.MessagesAvailable
ans = 7

Остановите канал

Используйте stop команда, чтобы установить канал оффлайн.

stop(rxCh);