Divide and Conquer
Linux Socket CAN 통신을 위한 Virtual CAN 환경 세팅 본문
출처: https://ola-page.tistory.com/66
Socket CAN 테스트를 위한 Virtual CAN 환경 구성 방법
Linux 환경에서 CAN 통신을 구현하기 위한 방법은 여러가지가 있을 수 있겠지만, 가장 일반적으로 사용할 수 있는 방법은 Socket CAN 일 것이다. Socket CAN 은 리눅스 커널에서 기본적으로 제공하는 CAN
ola-page.tistory.com
Linux에서 CAN 통신을 구현한다고 하면 가장 일반적으로 사용하는 것은 Socket CAN이다
Socket CAN은 리눅스 커널에서 기본적으로 제공하는 CAN 통신 드라이버라 별도의 드라이버, API가 필요없다
통신을 위해서는 USB to CAN 등의 별도 장치(Pcan usb, CANable)가 필요하지만, 가상의 인터페이스를 생성할 수 있다.
위에서 말한 장치들도 결국 Socket CAN 인터페이스를 생성해 준다면(CAN0, CAN1 등),
이 소켓을 이용해 CAN 통신을 하는 코드적인 구현은 모두 동일하다
그렇게 된다면 Socket CAN 인터페이스를 생성할 수 있다는 것을 확인한 이후에는
생성한 인터페이스를 이용해 통신하는 코드만 작성하면 된다!!!
가상 CAN 인터페이스 생성
1. vcan0 라는 이름의 가상 CAN 인터페이스를 생성하기
sudo ip link add dev vcan0 type vcan
2. 가상 인터페이스 생성 확인하기
ifconfig # vcan0 안 나옴. 인터페이스가 생성되었으나 활성화가 안 돼서
ifconfig -a # 얘로 확인해야 나옴
sudo ifconfig vcan0 up # vcan0 인터페이스를 활성화
ifconfig
가상 CAN 인터페이스 통신 확인
1. CAN-utils 설치
sudo apt-get install can-utils
2. CAN send 명령으로 CAN 통신 보내보기
cansend vcan0 999#DEADBEEF
vcan0 인터페이스를 통해서 ID: 999에 DEADBEEF 로 구성된 CAN 패킷을 보내는 명령
> 아무것도 안 일어남, 정상 동작된 게 맞음!!!
> vcan0라는 인터페이스가 존재하기에 아무런 에러가 발생하지 않은 것
3. CAN dump 명령으로 vcan0 인터페이스의 트래픽 확인해보기
candump vcan0
CAN dump 명령은 특정 인터페이스에서 보내거나, 수신하는 통신 트래픽을 나타내주는 명령으로
vcan0 인터페이스에서 CAN 통신을 보내는 것이나, 외부에서 보낸 CAN 통신이 vcan0로 들어오는 것을 확인할 수 있다
가상 인터페이스인 vcan0를 실제 Socket CAN 인터페이스처럼 동일하게 사용할 수 있다는 것을 확인했다
vcan0 인터페이스를 하나 만들어주면, 해당 인터페이스로 CAN 통신을 보낼 수 있지만 받을 수 없다
실제 Socket CAN 인터페이스라면 제 2의 외부 CAN 장치에서 CAN 통신을 수신하겠지만, 외부에서 해당 인터페이스로 보내주는 것이 없는 것이다.
받는 것도 테스트 하기 위해서 가상 CAN 인터페이스를 2개를 생성해 보자(두 인터페이스가 서로 통신을 주고 받게 하기 위함)
가상 CAN 인터페이스 추가 생성
sudo ip link add dev vcan1 type vcan # vcan1 인터페이스 생성
sudo ifconfig vcan1 up # vcan1 인터페이스 활성화
ifconfig # vcan1 인터페이스 생성 확인
현재 2개의 가상 Socket CAN 인터페이스 vcan0와 vcan1를 생성했다
그러나 vcan0 인터페이스에서 메시지를 보내면, vcan1로 데이터가 들어오지 않는다
CAN 장치 2개를 그저 존재하게 설정했기 때문에 연결되어 있지 않기 때문이다
- CANable(USB to CAN 장치) 2개가 그냥 따로 따로 있는 것과 같음
가상의 인터페이스들도 서로 연결해주는 작업이 필요하다
- 실제 CAN 장치들도 꼬인 2선으로 연결해 주어야 하는 것처럼!!!
가상 CAN 인터페이스 연결
sudo modprobe can-gw
sudo cangw -A -s vcan0 -d vcan1 -e # vcan0 > vcan1 연결
sudo cangw -A -s vcan1 -d vcan0 -e # vcan1 > vcan0 연결
> 쌍방 연결이 구성됨
> 이제 vcan0에서 뭔가 보내면, 연결된 vcan1로 데이터가 들어올 것
candump vcan0
candump vcan1
cansend vcan0 999#DEADBEEF
하단 터미널에서 vcan0 인터페이스를 통해 데이터를 보냈고
상단 좌측에서 vcan0의 트래픽(보낸 트래픽)
상단 우측에서 vcan1의 트래픽(받은 트래픽)을 확인할 수 있다
>>> vcan0로 CAN 통신을 보냈을 때, vcan1에서 수신이 되는 것을 확인
'2025 > 임베디드&네트워크' 카테고리의 다른 글
CPU 스케줄링 관점에서의 운영체제 발전 (0) | 2024.06.04 |
---|---|
[TC275] zsh: no such file or directory: C:\HIGHTEC\toolchains\tricore\v4.9.1.0-infineon-1.1\bin\tricore-gcc (0) | 2023.03.28 |
[TC275] java.lang.NullPointerException 에러 해결 방법 (0) | 2023.03.16 |
UDS 세미나 (0) | 2023.01.25 |
[TC275] Infineon TC275 기반 차량용 임베디드 시스템 (1) | 2022.12.26 |