Main Content

SocketCAN 设备快速入门

此示例说明如何在 Linux® 终端中识别、设置和配置 SocketCAN 设备,然后使用 Vehicle Network Toolbox™ 从 MATLAB® 访问它们。

配置 SocketCAN 设备需要系统 (sudo) 特权。此示例使用两个支持 SocketCAN 的 CAN/CAN FD 设备(can0can1),它们以环回模式相连接。

识别 Linux 系统上的 SocketCAN 设备

对于与 CAN/CAN FD 相关联的 SocketCAN 本机接口,硬件设备会在 Linux 网络层将其注册为 can0can1、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 并将设备名称指定为 can0can1,使用 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);

在本例中,can0can1 硬件设备以环回模式连接,使用 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 设备。