В этом примере показано, как сконфигурировать и использовать функцию обратного вызова для приема и обработки сообщений, полученных из канала CAN. Он использует каналы MathWorks Virtual CAN, подключенные в строении закольцовывания.
Создайте канал CAN для приема сообщений путем определения имени поставщика, имени устройства и индекса канала устройства.
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 в качестве примера и не является частью Vehicle Network Toolbox™. Когда сообщения передаются, функция обратного вызова выполняется каждый раз, когда достигается порог полученной функции.
generateMsgs();
Обратите внимание на оставшиеся сообщения в канале. Поскольку количество доступных сообщений ниже порога, заданного ранее, для запуска коллбэка в другой раз требуется больше сообщений.
rxCh
rxCh = Channel with properties: Device Information DeviceVendor: 'MathWorks' Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode: 'CAN' Status Information Running: 1 MessagesAvailable: 4 MessagesReceived: 399 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: 27-Jan-2021 15:37:48 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: []
Используйте stop
команда для перевода канала в автономный режим.
stop(rxCh);