Qt CAN 버스
CAN(컨트롤러 영역 네트워크)은 호스트 컴퓨터 없이도 애플리케이션에서 마이크로컨트롤러와 디바이스가 서로 통신할 수 있도록 설계된 차량 버스 표준입니다.
개요
메시지 기반 프로토콜로, 원래 자동차 내 멀티플렉스 전기 배선을 위해 설계되었지만 다른 많은 상황에서도 사용됩니다.
CAN 버스 API는 CAN 장치에 액세스하기 위한 몇 가지 공통 API를 제공합니다:
- QCanBus 선택한 플러그인에서 QCanBusDevice 을 생성하는 API를 제공합니다.
- QCanBusDeviceInfo 사용 가능한 CAN 장치에 대한 정보를 제공합니다.
- QCanBusDevice CAN 장치에 직접 액세스하기 위한 API를 제공합니다.
- QCanBusFrame QCanBusDevice 에서 쓰고 읽을 수 있는 CAN 프레임을 정의합니다.
Qt 6.5부터 이 모듈은 원시 CAN 프레임에서 실제 신호 값을 디코딩하고 사용자 데이터를 CAN 프레임으로 인코딩하기 위한 API를 제공합니다:
- QCanSignalDescription CAN 신호를 처리하는 규칙을 제공합니다.
- QCanMessageDescription CAN 메시지 처리를 위한 규칙을 제공합니다. 메시지 설명에는 일반적으로 여러 개의 신호 설명이 포함됩니다.
- QCanUniqueIdDescription CAN 프레임 내에서 고유 식별자를 처리하기 위한 규칙을 제공합니다.
- QCanFrameProcessor QCanMessageDescription , QCanSignalDescription, QCanUniqueIdDescription 클래스에서 제공하는 설명을 사용하여 CAN 프레임을 인코딩 또는 디코딩합니다.
- QCanDbcFileParser DBC 파일에서 메시지 설명을 추출하는 API를 제공합니다.
참고: CAN 프레임 인코딩 및 디코딩을 위한 모든 API는 실험 중이며 변경될 수 있습니다.
CAN 버스 플러그인
여러 공급업체에서 CAN 디바이스에 다양한 API를 제공합니다. QtSerialBus 모듈은 다음과 같은 CAN 버스 플러그인 세트를 지원합니다:
공급업체 | 플러그인(키) | 간단한 설명 |
---|---|---|
Linux 소켓을 통한 CAN | SocketCAN (socketcan ) | Linux 소켓과 오픈 소스 드라이버를 사용하는 CAN 버스 플러그인. |
SAE J2534 패스스루를 통한 CAN | PassThruCAN (passthrucan ) | SAE J2534 패스스루 인터페이스를 사용하는 CAN 버스 플러그인. |
SYS TEC 전자 | SystecCAN (systeccan ) | SYS TEC CAN 어댑터를 사용하는 CAN 버스 백엔드. |
PEAK-System | PeakCAN (peakcan ) | PEAK CAN 어댑터를 사용하는 CAN 버스 플러그인. |
MHS Elektronik | TinyCAN (tinycan ) | MHS CAN 어댑터를 사용하는 CAN 버스 플러그인. |
벡터 인포매틱 | VectorCAN (vectorcan ) | 벡터 CAN 어댑터를 사용하는 CAN 버스 플러그인. |
가상 CAN 인터페이스 | VirtualCAN (virtualcan ) | 가상 TCP/IP 연결을 사용하는 CAN 버스 플러그인. |
커스텀 CAN 플러그인 구현하기
Qt에서 제공하는 플러그인이 필요한 대상 플랫폼에 적합하지 않은 경우 사용자 정의 CAN 버스 플러그인을 구현할 수 있습니다. 구현은 Qt 플러그인 구현의 표준 방법을 따릅니다. 커스텀 플러그인은 $QTDIR/plugins/canbus
에 배포해야 합니다.
각 플러그인은 플러그인을 로드하는 데 사용되는 키를 정의해야 합니다. 이는 작은 json 파일을 통해 이루어집니다. 예를 들어, 소켓스캔 플러그인은 다음을 사용합니다 plugin.json
:
{ "Key": "socketcan" }
이 키는 CAN 버스 어댑터의 인터페이스 이름과 함께 QCanBus::createDevice()에 전달되어야 합니다. QCanBus 각 플러그인이 중앙 진입점으로 구현해야 하는 QCanBusFactoryV2 인터페이스를 사용하여 플러그인을 로드하고 인스턴스화합니다. 이 인터페이스는 팩토리 역할을 하며 유일한 목적은 QCanBusDevice 인스턴스를 반환하는 것입니다. 위에서 언급한 인터페이스 이름은 팩토리의 QCanBusFactory::createDevice() 메서드를 통해 전달됩니다. 다음은 소켓캔 플러그인의 팩토리 구현입니다:
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 의 구현을 제공하는 것입니다. 최소한 다음과 같은 순수 가상 함수를 구현해야 합니다:
- QCanBusDevice::open()
- QCanBusDevice::close()
- QCanBusDevice::writeFrame()
- QCanBusDevice::interpretErrorFrame()
open() 및 close() 메서드는 각각 QCanBusDevice::connectDevice() 및 QCanBusDevice::disconnectDevice()와 함께 사용됩니다. 구현에 대한 자세한 내용은 함수 설명서를 확인하세요.
QCanBusDevice::writeFrame()는 QCanBusFrame 의 유효성 및 디바이스가 여전히 연결되어 있는지 등의 건전성 검사를 담당합니다. 검사를 통과하면 프레임을 CAN 버스에 씁니다. 성공하면 QCanBusDevice::framesWritten() 신호를 보내고, 그렇지 않으면 QCanBusDevice::setError()이 적절한 오류 메시지와 함께 호출됩니다. 이 함수는 비동기 쓰기 작업을 구현하는 데에도 사용할 수 있습니다. 적절한 시기에 적절한 신호를 보내는 것은 플러그인 구현자의 책임입니다.
마지막으로, QCanBusDevice::interpretErrorFrame 은 CAN 버스 오류 프레임의 내용을 사람이 읽을 수 있는 오류 문자열로 변환하는 편리한 방법을 제공합니다.
© 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.