Qt CANバス
CAN(Controller Area Network)は、マイクロコントローラーやデバイスがホストコンピュータを介さずにアプリケーション間で通信できるように設計された車両バス規格です。
概要
CANはメッセージベースのプロトコルであり、もともとは自動車内の多重電気配線のために設計されましたが、他の多くの文脈でも使用されています。
CAN Bus APIは、CANデバイスにアクセスするための共通APIを提供しています:
- QCanBus 選択したプラグインから 。QCanBusDevice
- QCanBusDeviceInfo 利用可能なCANデバイスに関する情報を提供します。
- QCanBusDevice CANデバイスに直接アクセスするためのAPIを提供します。
- QCanBusFrame QCanBusDevice から読み書きできるCANフレームを定義します。
Qt 6.5以降、このモジュールは、生のCANフレームから実際の信号値をデコードするAPIと、ユーザーデータをCANフレームにエンコードするAPIを提供します:
- QCanSignalDescription CANシグナルを処理するルールを提供します。
- QCanMessageDescription CANメッセージを処理するルールを提供します。メッセージ記述には通常、複数のシグナル記述が含まれます。
- QCanUniqueIdDescription CANフレーム内の一意な識別子を処理するルールを提供する。
- QCanFrameProcessor QCanMessageDescription 、 、 クラスが提供する記述を使用して、CAN フレームをエンコードまたはデコードする。QCanSignalDescription QCanUniqueIdDescription
- QCanDbcFileParser DBCファイルからメッセージ記述を抽出するAPIを提供する。
注: CANフレームのエンコードとデコードのAPIはすべて実験的なものであり、変更される可能性があります。
CANバスプラグイン
複数のベンダーが、さまざまなアクセスAPIを持つCANデバイスを提供しています。QtSerialBus モジュールは、以下のCANバスプラグインセットをサポートしています:
ベンダー | プラグイン(キー) | 簡単な説明 |
---|---|---|
CANオーバーLinuxソケット | ソケットCAN(socketcan ) | Linux ソケットとオープンソースドライバを使った CAN バスプラグイン |
SAE J2534パススルー経由のCAN | PassThruCAN(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 Informatik | VectorCAN(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 の実装を行う。 少なくとも、以下の純粋仮想関数を実装する必要がある:
- 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.