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バスエラーフレームの内容を人間が読めるエラー文字列に変換する便利な方法があります。
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundationが発行したGNU Free Documentation License version 1.3の条項に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。