在 CAN 通信中使用报文接收回调函数
此示例说明如何使用回调函数来处理从 CAN 通道接收的报文。它使用以环回配置形式连接的 MathWorks® 虚拟 CAN 通道。此示例说明 CAN 网络的工作流,但所展示的概念也适用于 CAN FD 网络。
创建接收通道
通过指定供应商名称、设备名称和设备通道索引,使用 canChannel
创建一个 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: [0×0 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 = 11
停止通道
使用 stop
命令将通道设置为离线状态。
stop(rxCh);