SocketCAN 플러그인 사용
SocketCAN 플러그인은 CAN 장치에 액세스하기 위한 Linux 소켓 API를 캡슐화합니다. 이 API는 폭스바겐 리서치가 리눅스 커널에 기여한 오픈 소스 CAN 드라이버 및 네트워킹 스택 세트입니다.
이 플러그인을 사용하려면 SocketCAN을 지원하는 Linux 커널과 사용 중인 CAN 하드웨어용 SocketCAN 디바이스 드라이버가 필요합니다.
SocketCAN 사용법
모든(구성되지 않은 포함) 네트워크 인터페이스를 나열하려면 ifconfig -a
명령을 사용할 수 있습니다.
SocketCAN을 사용하려면 해당 Linux 커널 모듈을 로드하고 네트워크 인터페이스를 구성해야 합니다.
실제 CAN 하드웨어 설정
이 섹션에서는 장치 드라이버가 이미 로드되어 있다고 가정합니다(대부분 CAN 하드웨어를 연결할 때 자동으로 로드됨).
기본 설정
장치 can0을 250kBit/s의 비트 전송률로 설정합니다:
sudo ip link set up can0 type can bitrate 250000
100밀리초 후에 '버스 꺼짐' 오류에서 자동으로 복구하려면 다음 명령을 사용할 수 있습니다:
sudo ip link set up can0 type can bitrate 250000 restart-ms 100
CAN FD 설정
장치 can0을 중재 비트 전송률 500kBit/s 및 데이터 비트 전송률 4MBit/s로 설정합니다(비트 전송률 스위치 플래그가 있는 프레임의 경우):
sudo ip link set can0 up type can bitrate 500000 dbitrate 4000000 fd on
가상 CAN 버스 설정
참고: CAN FD를 사용하려면 MTU(최대 전송 단위)를 72바이트로 설정해야 합니다.
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0 mtu 72
다음에서 사용되는 명령줄 테스트 프로그램은 can-utils 패키지에서 가져온 것입니다:
# Display received CAN messages with absolute timestamps and flags candump -ta -x vcan0 # Send a CAN FD message with flags BRS and EFI set cansend vcan0 123##3112233445566778899aabbccddeeff # Generate random CAN messages cangen vcan0
CAN 버스 디바이스 생성
먼저 QCanBus 에서 원하는 플러그인을 제공하는지 확인해야 합니다:
if (QCanBus::instance()->plugins().contains(QStringLiteral("socketcan"))) { // plugin available }
여기서 소켓캔은 플러그인 이름입니다.
다음으로 특정 인터페이스에 대한 연결을 설정할 수 있습니다:
QString errorString;QCanBusDevice *device = QCanBus::instance()->createDevice( QStringLiteral("소켓캔"), QStringLiteral("can0"), &errorString);if (!device) { // 오류 처리는 여기서 진행됩니다. qDebug << errorString; } else { device->connectDevice(); }
여기서 can0은 활성 CAN 인터페이스 이름입니다. CAN 인터페이스는 Linux 시스템에서 일반 네트워크 인터페이스처럼 작동하며 ifconfig
을 사용하여 검색할 수 있습니다. 또한 availableDevices() 메서드는 현재 사용 가능한 장치 목록을 반환합니다.
이제 장치가 CAN 프레임 쓰기 및 읽기를 위해 열려 있습니다:
QCanBusFrame frame; frame.setFrameId(8); QByteArray payload("A36E"); frame.setPayload(payload); device->writeFrame(frame);
읽기는 readFrame() 메서드를 사용하여 수행할 수 있습니다. framesReceived () 신호는 읽기에 사용할 수 있는 새 프레임이 하나 이상 있으면 전송됩니다:
QCanBusFrame frame = device->readFrame();
SocketCAN은 setConfigurationParameter()를 통해 제어할 수 있는 다음 구성을 지원합니다:
구성 파라미터 키 | 설명 |
---|---|
QCanBusDevice::LoopbackKey | 다중 사용자 요구를 충족하기 위해 로컬 루프백은 기본적으로 활성화되어 있습니다. 즉, CAN 프레임이 CAN 버스에서 전송될 때마다 이 프레임의 로컬 에코가 이 CAN 장치에 연결된 모든 애플리케이션에 전송됩니다. 이 옵션을 활성화하면 수신된 프레임에 QCanBusFrame::hasLocalEcho()가 표시됩니다. |
QCanBusDevice::ReceiveOwnKey | CAN 프레임을 전송한 소켓에서 CAN 프레임을 수신하는 것은 기본적으로 비활성화되어 있습니다. 이 옵션을 활성화하면 CAN 버스로 전송된 모든 CAN 프레임이 수신 버퍼에 즉시 나타납니다. 이를 통해 전송이 성공했는지 확인할 수 있습니다. 이 옵션을 활성화하면 수신된 프레임에 QCanBusFrame::hasLocalEcho()가 표시됩니다. |
QCanBusDevice::ErrorFilterKey | CAN 인터페이스 드라이버는 다른 CAN 프레임과 동일한 방식으로 사용자 어플리케이션에 선택적으로 전달할 수 있는 오류 메시지 프레임을 생성할 수 있습니다. 발생 가능한 오류는 적절한 오류 마스크를 사용하여 필터링할 수 있는 여러 오류 클래스로 나뉩니다. 오류 마스크의 값은 linux/can/error.h 에 정의되어 있습니다. |
QCanBusDevice::RawFilterKey | 이 구성에는 QCanBusDevice::Filter 유형의 필터를 여러 개 포함할 수 있습니다. 기본적으로 연결은 모든 CAN 버스 메시지를 수락하도록 구성됩니다. |
QCanBusDevice::BitRateKey | CAN 버스 연결의 비트 전송률을 결정합니다. 지원되는 비트 전송률은 다음과 같습니다: 5000, 10000, 20000, 33000, 47000, 50000, 83000, 95000, 100000, 125000, 250000, 500000, 800000, 1000000. 이 구성 매개변수는 QCanBusDevice 에 연결되지 않은 상태에서만 조정할 수 있습니다. 이 구성 매개변수를 설정하려면 런타임에 libsocketcan 라이브러리가 필요합니다 http://www.pengutronix.de/software/libsocketcan 일반적으로 CAN 버스 비트 전송률을 설정하려면 루트 권한이 필요합니다. |
QCanBusDevice::CanFdKey | 이 구성 옵션은 CANFD 프레임의 전송 또는 수신 여부를 결정합니다. 기본적으로 이 옵션은 비활성화되어 있습니다. 이 옵션은 CAN 소켓의 CAN_RAW_FD_FRAMES 옵션을 제어합니다. |
QCanBusDevice::DataBitRateKey | 이 구성은 socketcan 플러그인에서 지원되지 않습니다. 그러나 ip link 명령을 사용하여 CAN 네트워크 인터페이스를 구성할 때 데이터 속도를 설정할 수 있습니다. |
QCanBusDevice::ProtocolKey | 프로토콜 패밀리 PF_CAN 내에서 다른 프로토콜을 사용할 수 있습니다. 이 구성 옵션의 기본값은 CAN_RAW (1)입니다. |
예를 들어
QList<QCanBusDevice::Filter> list; QCanBusDevice::Filter f; // only accept odd numbered frame id of type remote request // frame can utilize extended or base format f.frameId = 0x1; f.frameIdMask = 0x1; f.format = QCanBusDevice::Filter::MatchBaseAndExtendedFormat; f.type = QCanBusFrame::RemoteRequestFrame; list.append(f); device->setConfigurationParameter(QCanBusDevice::RawFilterKey, QVariant::fromValue(list)); device->setConfigurationParameter(QCanBusDevice::ErrorFilterKey, QVariant::fromValue(QCanBusFrame::FrameErrors(QCanBusFrame::AnyError)));
확장 프레임 형식과 유연한 데이터 전송률이 SocketCAN에서 지원됩니다.
SocketCAN은 다음과 같은 추가 기능을 지원합니다:
- QCanBusDevice::resetController() (libsocketcan 필요)
- QCanBusDevice::busStatus() (libsocketcan 필요)
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.