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 、 、および クラスが提供する記述を使用して、CANフレームのエンコードまたはデコードを行います。QCanSignalDescription QCanUniqueIdDescription
- QCanDbcFileParser DBC ファイルからメッセージ記述を抽出するための API を提供します。
注: CAN フレームのエンコードおよびデコードに関するすべての API は実験的なものであり、変更される可能性があります。
CAN バスプラグイン
複数のベンダーが、アクセス用のさまざまなAPIを備えたCANデバイスを提供しています。QtSerialBus モジュールは、以下のCANバスプラグインセットをサポートしています:
| ベンダー | プラグイン (キー) | 概要 |
|---|---|---|
| Linuxソケット経由のCAN | SocketCAN(socketcan) | Linuxソケットとオープンソースドライバを使用したCANバスプラグイン。 |
| SAE J2534 パススルー経由の CAN | PassThruCAN(passthrucan) | SAE J2534 パススルーインターフェースを使用した CAN バスプラグイン。 |
| SYS TEC electronic | SystecCAN(systeccan) | SYS TEC CANアダプタを使用したCANバスバックエンド。 |
| PEAK-System | PeakCAN(peakcan) | PEAK CAN アダプタを使用した CAN バス・プラグイン。 |
| MHS Elektronik | 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バスエラーフレームの内容を、人間が読み取れるエラー文字列に変換するための便利な方法を提供します。
© 2026 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.