SocketCAN 设备快速入门
此示例说明如何在 Linux® 终端中识别、设置和配置 SocketCAN 设备,然后使用 Vehicle Network Toolbox™ 从 MATLAB® 访问它们。
配置 SocketCAN 设备需要系统 (sudo) 特权。此示例使用两个支持 SocketCAN 的 CAN/CAN FD 设备(can0
和 can1
),它们以环回模式相连接。
识别 Linux 系统上的 SocketCAN 设备
对于与 CAN/CAN FD 相关联的 SocketCAN 本机接口,硬件设备会在 Linux 网络层将其注册为 can0
、can1
、can2 等。当您将 SocketCAN 设备插入 Linux 系统时,Linux 内核会加载对应的设备驱动程序,并且 Linux 网络层会创建与该设备对应的 CAN 网络接口(例如 can0
)。
要查看系统上支持 SocketCAN/CAN FD 的可用硬件设备列表,请在 Linux 终端中运行以下命令:
ip -details link show type can
这将列出系统上所有受支持的硬件 CAN/CAN FD 设备:
% ip -details link show type can 7: can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 minmtu 0 maxmtu 0 can state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 500000 sample-point 0.875 tq 12 prop-seg 69 phase-seg1 70 phase-seg2 20 sjw 1 pcan_usb_pro_fd: tseg1 1..256 tseg2 1..128 sjw 1..128 brp 1..1024 brp-inc 1 pcan_usb_pro_fd: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..1024 dbrp-inc 1 clock 80000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 8: can1: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 minmtu 0 maxmtu 0 can state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 500000 sample-point 0.875 tq 12 prop-seg 69 phase-seg1 70 phase-seg2 20 sjw 1 pcan_usb_pro_fd: tseg1 1..256 tseg2 1..128 sjw 1..128 brp 1..1024 brp-inc 1 pcan_usb_pro_fd: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..1024 dbrp-inc 1 clock 80000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
根据连接的网络设备数量和 CAN 设备类型,您的输出可能会有所不同。
如果连接的设备没有显示,可能是 Linux 网络层检测不到该设备,需要针对供应商加载设备特定的 CAN 模块。您可以使用 modprobe
命令加载供应商特定的 CAN 模块。例如,要加载 Kvaser CAN 模块,请运行 % sudo modprobe kvaser_usb
。如果已连接的 CAN 设备仍无法列出,请联系您的设备供应商寻求帮助。
配置 SocketCAN 设备
在识别要与 SocketCAN 结合使用的 CAN 设备后,可以根据您的需求配置这些设备。此处列出了标准 CAN 和 CAN FD 设备设置。
要为 CAN 通信设置 can0
设备,请执行以下命令:
sudo ip link set can0 type can bitrate 500000
要为 CAN FD 通信设置 can1
设备,请执行以下命令:
sudo ip link set can1 type can bitrate 500000 sample-point 0.75 dbitrate 4000000 dsample-point 0.8 fd on
在设备配置过程中,您还可以修改 SocketCAN - 控制器局域网页中显示的其他参数。
创建虚拟 SocketCAN 设备(可选)
您还可以使用 SocketCAN 创建虚拟通道。创建一个虚拟 SocketCAN 通道 vcan0
。
sudo ip link add dev vcan0 type vcan
要可视化 CAN/CAN FD 支持的可用 SocketCAN 虚拟接口,请运行以下命令:
ip -details link show type vcan
使配置的设备在线
MATLAB 和 Simulink® 只会列出配置正确并且在线的 SocketCAN 设备。使配置的硬件设备在线。
sudo ip link set up can0 sudo ip link set up can1
使配置的虚拟设备在线。
sudo ip link set up vcan0
与 SocketCAN 设备通信
设置 SocketCAN 设备并使其在线后,您可以像使用任何其他支持 CAN/CAN FD 的设备一样,通过 MATLAB 和 Simulink 使用它们进行 CAN 通信。
要可视化正确配置的 SocketCAN 设备,请在 MATLAB 中调用 canChannelList
。
canChannelList
ans=5×6 table
Vendor Device Channel DeviceModel ProtocolMode SerialNumber
___________ ___________ _______ ___________ _____________ ____________
"MathWorks" "Virtual 1" 1 "Virtual" "CAN, CAN FD" "0"
"MathWorks" "Virtual 1" 2 "Virtual" "CAN, CAN FD" "0"
"SocketCAN" "can0" NaN "" "CAN" "0"
"SocketCAN" "can1" NaN "" "CAN, CAN FD" "0"
"SocketCAN" "vcan0" NaN "Virtual" "CAN, CAN FD" "0"
canFDChannelList
ans=4×6 table
Vendor Device Channel DeviceModel ProtocolMode SerialNumber
___________ ___________ _______ ___________ _____________ ____________
"MathWorks" "Virtual 1" 1 "Virtual" "CAN, CAN FD" "0"
"MathWorks" "Virtual 1" 2 "Virtual" "CAN, CAN FD" "0"
"SocketCAN" "can1" NaN "" "CAN, CAN FD" "0"
"SocketCAN" "vcan0" NaN "Virtual" "CAN, CAN FD" "0"
通过将供应商名称指定为 SocketCAN
并将设备名称指定为 can0
和 can1
,使用 canChannel
创建一个 CAN 通道来传输和接收 CAN 报文。
ch1 = canChannel('SocketCAN','can0')
ch1 = Channel with properties: Device Information DeviceVendor: 'SocketCAN' Device: 'can0' ProtocolMode: 'CAN' Status Information Running: 0 MessagesAvailable: 0 MessagesReceived: 0 MessagesTransmitted: 0 InitialTimestamp: [0×0 datetime] FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All' Channel Information BusStatus: 'ERROR-ACTIVE' ReceiveErrorCount: 0 TransmitErrorCount: 0 BusSpeed: 500000 Other Information Database: [] UserData: []
ch2 = canChannel('SocketCAN','can1')
ch2 = Channel with properties: Device Information DeviceVendor: 'SocketCAN' Device: 'can1' ProtocolMode: 'CAN' Status Information Running: 0 MessagesAvailable: 0 MessagesReceived: 0 MessagesTransmitted: 0 InitialTimestamp: [0×0 datetime] FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All' Channel Information BusStatus: 'ERROR-ACTIVE' ReceiveErrorCount: 0 TransmitErrorCount: 0 BusSpeed: 500000 Other Information Database: [] UserData: []
使用 canMessage
创建一条 CAN 报文进行传输。
message = canMessage(250, false, 8); message.Data = ([45 213 53 1 3 213 123 43]);
使用 start
命令将通道设置为在线状态。
start(ch1); start(ch2);
在本例中,can0
和 can1
硬件设备以环回模式连接,使用 transmit
函数在 ch1
上传输。
transmit(ch1,message);
使用 receive
函数接收来自通道的所有可用报文。
rxMsg = receive(ch2,Inf,"OutputFormat","timetable"); head(rxMsg)
Time ID Extended Name Data Length Signals Error Remote __________ ___ ________ __________ ____________________________ ______ ____________ _____ ______ 2.2614 sec 250 false {0×0 char} {[45 213 53 1 3 213 123 43]} 8 {0×0 struct} false false
将通道设置为离线。
stop(ch1); stop(ch2);
关闭在线设备
完成使用 SocketCAN 设备后,在 Linux 终端中关闭在线设备。
sudo ip link set down can0 sudo ip link set down can1 sudo ip link set down vcan0
在 MATLAB 执行期间,如果您要更改任何 CAN 设备参数,请关闭设备、更改参数,然后再次使设备在线。这也会重置 CAN 设备。