XCAN-USB FD 适配器 socket can 硬件映射绑定

XCAN-USB FD 适配器 映射绑定

两个同型号 XCAN-USB FD 适配器(VID 0c72, PID 0012),无硬件序列号(iSerial=0)

查看an_channel_id 都是 FFFFFFFF

cat /sys/class/net/can0/peak_usb/can_channel_id
cat /sys/class/net/can1/peak_usb/can_channel_id

目标:通过写入硬件 Device ID(can_channel_id)实现永久绑定,不依赖物理端口。

image

一、写入 Device ID

  • 一台 Windows 电脑,用于写入设备号。

  • 每次只插入一块适配器进行操作。

操作步骤

peak-system.com.cn

image

  1. 安装 PEAK 驱动和 PCAN-View

从 PEAK 官网下载 PCAN-Driver 安装包,安装时勾选 PCAN-View 组件。

  1. 写入 Device ID

    • 插入第一块适配器。

    • 打开 PCAN-View,点击 Connect, 左侧列表选择设备.点击 OK

    • 下方新增的选项卡,找到 PCAN-USB FD选项, 找到**Device ID **字段。

image

- 设为 1,点击 Set。

- 拔下第一块,插入第二块,重复操作,设为 2

或者使用 PEAK Settings
PEAK Settings

根据电脑的can驱动选择不同的绑定方式

LINUX peak_usb

  1. 验证写入结果

将两块适配器插入 Linux 电脑,执行:

cat /sys/class/net/can0/peak_usb/can_channel_id
cat /sys/class/net/can1/peak_usb/can_channel_id

应分别显示 0000000100000002(不再是 FFFFFFFF)。


二、编写重命名脚本

创建脚本 fix-can-names_peak.sh

脚本内容

#!/bin/bash
# 等待 can 接口出现
for i in $(seq 1 30); do
  if ls /sys/class/net/can* >/dev/null 2>&1; then break; fi
  sleep 0.2
done

renamed_left=0
renamed_right=0

for iface in $(ls /sys/class/net/ | grep '^can'); do
  # 跳过已改名的
  [[ "$iface" == "can-left" || "$iface" == "can-right" ]] && continue

  idf="/sys/class/net/$iface/peak_usb/can_channel_id"
  if [ ! -r "$idf" ]; then
    echo "[fix-can-names] WARNING: $idf not readable for $iface" >&2
    continue
  fi

  id=$(tr -d '\n\r' < "$idf")
  echo "[fix-can-names] $iface has channel_id=$id" >&2

  case "$id" in
    00000001)
      if [ "$renamed_left" -eq 0 ]; then
        echo "[fix-can-names] Renaming $iface -> can-left" >&2
        ip link set "$iface" down 2>/dev/null
        ip link set "$iface" name can-left 2>/dev/null && renamed_left=1
      fi
      ;;
    00000002)
      if [ "$renamed_right" -eq 0 ]; then
        echo "[fix-can-names] Renaming $iface -> can-right" >&2
        ip link set "$iface" down 2>/dev/null
        ip link set "$iface" name can-right 2>/dev/null && renamed_right=1
      fi
      ;;
    *)
      echo "[fix-can-names] Unknown channel_id $id for $iface, skipping" >&2
      ;;
  esac
done

赋予执行权限

chmod +x fix-can-names_peak.sh

三、验证

测试

将两块适配器插入 Linux 电脑

sudo ./fix-can-names_peak.sh

输出

[fix-can-names] can0 has channel_id=00000001
[fix-can-names] Renaming can0 -> can-left
[fix-can-names] can1 has channel_id=00000002
[fix-can-names] Renaming can1 -> can-right

检查结果

ls /sys/class/net/ | grep can
cat /sys/class/net/can-right/peak_usb/can_channel_id
cat /sys/class/net/can-left/peak_usb/can_channel_id

应输出can-leftcan-right

确认 channel_id 对应关系

cat /sys/class/net/can-left/peak_usb/can_channel_id   # 应为 00000001
cat /sys/class/net/can-right/peak_usb/can_channel_id  # 应为 00000002

ros@u22:~/Downloads$ sudo ./fix-can-names_peak.sh 
[fix-can-names] can0 has channel_id=00000002
[fix-can-names] Renaming can0 -> can-right
[fix-can-names] can1 has channel_id=00000001
[fix-can-names] Renaming can1 -> can-left
ros@u22:~/Downloads$ ls /sys/class/net/ | grep can
can-left
can-right
ros@u22:~/Downloads$ cat /sys/class/net/can-right/peak_usb/can_channel_id
00000002
ros@u22:~/Downloads$ cat /sys/class/net/can-left/peak_usb/can_channel_id
00000001
ros@u22:~/Downloads$ 

后续使用说明

  • 应用程序中统一使用接口名 can-leftcan-right,不再依赖 can0/can1

  • 如需交换左右手角色,只需在脚本中将 0000000100000002对应的目标名互换即可。

LINUX pcan

  1. 验证写入结果

将两块适配器插入 Linux 电脑,执行:

lsmod | grep can
----------
pcan                  208896  0
can_dev                32768  1 pcan

PEAK 官方 pcan 字符驱动lsmod里的 pcan模块)。与peak_usb驱动暴露信息的方式完全不同——

  • peak_usb→ 走 socketcan 原生路径 → 有 peak_usb/can_channel_id

  • pcan驱动 → 走 /proc/pcan+ /dev/pcanX没有那个 sysfs 节点

使用 cat /proc/pcan 命令

cat /proc/pcan
---------------
*------------- PEAK-System CAN interfaces (www.peak-system.com) -------------
*------------- Release_20220929_n (8.15.2) Jun  9 2026 11:22:34 --------------
*------------------- [mod] [isa] [pci] [pec] [usb] [net] --------------------
*--------------------- 2 interfaces @ major 507 found -----------------------
*n -type- -ndev- --base-- irq --btr- --read-- --write- --irqs-- -errors- status
32  usbfd   can0 ffffffff 002 0x001c 00000000 00000000 00000000 00000000 0x0000
33  usbfd   can1 ffffffff 001 0x001c 00000000 00000000 00000000 00000000 0x0000

其中irq的下方 显示的就是Device ID

应分别显示 001002

二、编写重命名脚本

创建脚本 fix-can-names-pcan.sh

脚本内容

#!/bin/bash
# 通过 /proc/pcan 的 irq 列(=Device Number)区分左右手

# 等 can 接口出现
for i in $(seq 1 50); do
  if [ -f /proc/pcan ] && ls /sys/class/net/can* >/dev/null 2>&1; then
    grep -q "usbfd.*can" /proc/pcan 2>/dev/null && break
  fi
  sleep 0.2
done

[ ! -f /proc/pcan ] && echo "[fix-can] /proc/pcan not found, abort" >&2 && exit 1

renamed_left=0
renamed_right=0

while read -r n type ndev base irq rest; do
  [ "$type" != "usbfd" ] && continue
  [[ ! "$ndev" =~ ^can[0-9] ]] && continue

  devnum="$irq"
  echo "[fix-can] $ndev -> Device Number=$devnum"

  case "$devnum" in
    001|1)
      if [ "$renamed_left" -eq 0 ]; then
        echo "[fix-can] Renaming $ndev -> can-left"
        ip link set "$ndev" down
        if ip link set "$ndev" name can-left; then
          renamed_left=1
        else
          echo "[fix-can] ERROR: failed to rename $ndev to can-left" >&2
        fi
      fi
      ;;
    002|2)
      if [ "$renamed_right" -eq 0 ]; then
        echo "[fix-can] Renaming $ndev -> can-right"
        ip link set "$ndev" down
        if ip link set "$ndev" name can-right; then
          renamed_right=1
        else
          echo "[fix-can] ERROR: failed to rename $ndev to can-right" >&2
        fi
      fi
      ;;
    *)
      echo "[fix-can] WARNING: unknown Device Number '$devnum' on $ndev" >&2
      ;;
  esac
done < <(grep "usbfd" /proc/pcan)

# 如果改名成功,把接口 up 起来(可选)
for iface in can-left can-right; do
  if ip link show "$iface" >/dev/null 2>&1; then
    ip link set "$iface" up type can bitrate 1000000 2>/dev/null || true
  fi
done

赋予执行权限

chmod +x fix-can-names-pcan.sh

三、验证

测试

将两块适配器插入 Linux 电脑

sudo ./fix-can-names-pcan.sh

输出

[fix-can] can0 -> Device Number=002
[fix-can] Renaming can0 -> can-right
[fix-can] can1 -> Device Number=001
[fix-can] Renaming can1 -> can-left

检查结果

cat /proc/pcan
-------------
*------------- PEAK-System CAN interfaces (www.peak-system.com) -------------
*------------- Release_20220929_n (8.15.2) Jun  9 2026 11:22:34 --------------
*------------------- [mod] [isa] [pci] [pec] [usb] [net] --------------------
*--------------------- 2 interfaces @ major 507 found -----------------------
*n -type- -ndev- --base-- irq --btr- --read-- --write- --irqs-- -errors- status
32  usbfd can-left ffffffff 002 0x001c 00000000 00000000 00000000 00000000 0x0000
33  usbfd can-right ffffffff 001 0x001c 00000000 00000000 00000000 00000000 0x0000

应输出can-left 001 和 can-right 002。


./canset_pcan.sh
 cat /proc/pcan
-------------
*------------- PEAK-System CAN interfaces (www.peak-system.com) -------------
*------------- Release_20220929_n (8.15.2) Jun  9 2026 11:22:34 --------------
*------------------- [mod] [isa] [pci] [pec] [usb] [net] --------------------
*--------------------- 2 interfaces @ major 507 found -----------------------
*n -type- -ndev- --base-- irq --btr- --read-- --write- --irqs-- -errors- status
32  usbfd can-left ffffffff 002 0x001c 00000000 00000000 00000000 00000000 0x0000
33  usbfd can-right ffffffff 001 0x001c 00000000 00000000 00000000 00000000 0x0000

后续使用说明

  • 应用程序中统一使用接口名 can-leftcan-right,不再依赖 can0/can1
posted @ 2026-06-17 17:57  一蜘  阅读(64)  评论(0)    收藏  举报