Этот пример показывает вам, как использовать функцию обратного вызова, чтобы обработать сообщения, полученные от канала 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();
Отобразите MessagesAvailable
свойство канала видеть количество остающихся сообщений. Поскольку доступное количество сообщения ниже заданного порога, больше сообщений требуется, чтобы инициировать коллбэк другое время.
rxCh.MessagesAvailable
ans = 7
Используйте stop
команда, чтобы установить канал оффлайн.
stop(rxCh);