Qt CANバス

CAN(Controller Area Network)は、マイクロコントローラーやデバイスがホストコンピュータを介さずにアプリケーション間で通信できるように設計された車両バス規格です。

概要

CANはメッセージベースのプロトコルであり、もともとは自動車内の多重電気配線のために設計されましたが、他の多くの文脈でも使用されています。

CAN Bus APIは、CANデバイスにアクセスするための共通APIを提供しています:

Qt 6.5以降、このモジュールは、生のCANフレームから実際の信号値をデコードするAPIと、ユーザーデータをCANフレームにエンコードするAPIを提供します:

注: CANフレームのエンコードとデコードのAPIはすべて実験的なものであり、変更される可能性があります。

CANバスプラグイン

複数のベンダーが、さまざまなアクセスAPIを持つCANデバイスを提供しています。QtSerialBus モジュールは、以下のCANバスプラグインセットをサポートしています:

ベンダープラグイン(キー)簡単な説明
CANオーバーLinuxソケットソケットCAN(socketcan)Linux ソケットとオープンソースドライバを使った CAN バスプラグイン
SAE J2534パススルー経由のCANPassThruCAN(passthrucan)SAE J2534 Pass-Thruインターフェースを使用したCANバスプラグイン。
SYS TECエレクトロニクスSystecCAN(systeccan)SYS TEC CANアダプタを使用したCANバスバックエンド。
ピークシステムPeakCAN(peakcan)PEAK CANアダプターを使用したCANバスプラグインです。
MHSエレクトロニクスTinyCAN(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バスエラーフレームの内容を人間が読めるエラー文字列に変換する便利な方法を提供します。

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