이 페이지에서

Qt CAN 버스

CAN(Controller Area Network)은 호스트 컴퓨터가 없는 애플리케이션에서 마이크로컨트롤러와 장치들이 서로 통신할 수 있도록 설계된 차량용 버스 표준입니다.

개요

이 프로토콜은 메시지 기반 프로토콜로, 원래 자동차 내부의 다중 전기 배선을 위해 설계되었지만 다른 여러 분야에서도 사용됩니다.

CAN 버스 API는 CAN 장치에 액세스하기 위한 몇 가지 공통 API를 제공합니다.

  • QCanBus 선택한 플러그인을 사용하여 CAN 장치 객체( QCanBusDevice )를 생성하는 API를 제공합니다.
  • QCanBusDeviceInfo 사용 가능한 CAN 장치에 대한 정보를 제공합니다.
  • QCanBusDevice CAN 장치에 직접 액세스할 수 있는 API를 제공합니다.
  • QCanBusFrame QCanBusDevice 에서 읽고 쓸 수 있는 CAN 프레임을 정의합니다.

Qt 6.5부터 이 모듈은 원시 CAN 프레임에서 실제 신호 값을 디코딩하고, 사용자 데이터를 CAN 프레임으로 인코딩하는 API를 제공합니다:

참고: CAN 프레임 인코딩 및 디코딩을 위한모든 API는 실험적이며 변경될 수 있습니다.

CAN 버스 플러그인

여러 공급업체에서 각기 다른 액세스 API를 갖춘 CAN 장치를 제공합니다. QtSerialBus 모듈은 다음의 CAN 버스 플러그인 세트를 지원합니다:

벤더플러그인(키)간략한 설명
Linux 소켓을 통한 CANSocketCAN (socketcan)리눅스 소켓과 오픈 소스 드라이버를 사용하는 CAN 버스 플러그인.
SAE J2534 패스스루를 통한 CANPassThruCAN (passthrucan)SAE J2534 패스스루 인터페이스를 사용하는 CAN 버스 플러그인.
SYS TEC electronicSystecCAN (systeccan)SYS TEC CAN 어댑터를 사용하는 CAN 버스 백엔드.
PEAK-SystemPeakCAN (peakcan)PEAK CAN 어댑터를 사용하는 CAN 버스 플러그인.
MHS ElektronikTinyCAN (tinycan)MHS CAN 어댑터를 사용하는 CAN 버스 플러그인.
Vector InformatikVectorCAN (vectorcan)Vector CAN 어댑터를 사용하는 CAN 버스 플러그인.
가상 CAN 인터페이스VirtualCAN (virtualcan)가상 TCP/IP 연결을 사용하는 CAN 버스 플러그인.

사용자 정의 CAN 플러그인 구현

Qt에서 제공하는 플러그인이 필요한 대상 플랫폼에 적합하지 않은 경우, 사용자 정의 CAN 버스 플러그인을 구현할 수 있습니다. 구현 방법은 Qt 플러그인을 구현하는 표준 방식을 따릅니다. 사용자 정의 플러그인은 $QTDIR/plugins/canbus 에 배포되어야 합니다.

각 플러그인은 플러그인을 로드하는 데 사용되는 키를 정의해야 합니다. 이는 작은 JSON 파일을 통해 이루어집니다. 예를 들어, socketcan 플러그인은 다음과 같은 plugin.json 를 사용합니다:

{
    "Key": "socketcan"
}

이 키는 CAN 버스 어댑터의 인터페이스 이름과 함께 QCanBus::createDevice()에 전달되어야 합니다. QCanBus 는 각 플러그인이 중앙 진입점으로 구현해야 하는 QCanBusFactoryV2 인터페이스를 사용하여 플러그인을 로드하고 인스턴스화합니다. 이 인터페이스는 팩토리 역할을 하며, 유일한 목적은 ` QCanBusDevice ` 인스턴스를 반환하는 것입니다. 앞서 언급한 인터페이스 이름은 팩토리의 ` QCanBusFactory::createDevice()` 메서드를 통해 전달됩니다. 다음은 socketcan 플러그인의 팩토리 구현입니다:

class SocketCanBusPlugin : public QObject, public QCanBusFactory
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json")
    Q_INTERFACES(QCanBusFactory)

public:
    QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override
    {
        Q_UNUSED(errorMessage);
        return SocketCanBackend::interfaces();
    }

    QCanBusDevice *createDevice(const QString &interfaceName, QString *errorMessage) const override
    {
        Q_UNUSED(errorMessage);
        auto device = new SocketCanBackend(interfaceName);
        return device;
    }
};

다음 단계는 ` QCanBusDevice`의 구현을 제공하는 것입니다. 최소한 다음의 순수 가상 함수들은 구현되어야 합니다:

open() 및 close() 메서드는 각각 QCanBusDevice::connectDevice() 및 QCanBusDevice::disconnectDevice()와 함께 사용됩니다. 구현에 대한 자세한 내용은 함수 설명서를 참조하십시오.

QCanBusDevice::writeFrame()는 QCanBusFrame 의 유효성 및 장치가 여전히 연결되어 있는지 여부와 같은 정상성 검사를 담당합니다. 검사가 통과되면 프레임을 CAN 버스에 기록합니다. 성공 시 QCanBusDevice::framesWritten() 신호를 발생시키고, 그렇지 않은 경우 적절한 오류 메시지와 함께 QCanBusDevice::setError()가 호출됩니다. 이 함수는 비동기 쓰기 작업을 구현하는 데에도 사용할 수 있습니다. 적절한 시점에 적절한 신호를 발생시키는 것은 플러그인 구현자의 책임입니다.

마지막으로, ` QCanBusDevice::interpretErrorFrame `는 CAN 버스 오류 프레임의 내용을 사람이 읽을 수 있는 오류 문자열로 변환하는 편리한 방법을 제공합니다.

© 2026 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.