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バスエラーフレームの内容を人間が読めるエラー文字列に変換する便利な方法があります。

©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundationが発行したGNU Free Documentation License version 1.3の条項に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。