こんにちは、OTです。
第2回では、CANメッセージの送信/受信まで説明させていただきました。
今回は、CAN通信終了までを説明させていただきます。
第1回~第2回と同様、Vector社から提供されているCAN通信ライブラリ「XL Driver Library」を用いて、CAN通信してみます。
通信方法としては、Virtual CAN Bus(PC内でシミュレーションする仮想のCAN BUS)を使用します。

サンプルコード(C++)
以下、CAN通信終了するまでのサンプルコードを記載させていただきます。
※エラー時の処理は省略。
第2回で作成したサンプルコードにドライバクローズ用の関数(CanDriverClose)を追加。
ドライバオープン用の関数(CanDriverOpen)、通信テスト用の関数(CanTest)の詳細は第1回~第2回参照。
#include <iostream>
#include <windows.h>
#include <thread>
#include "vxlapi.h"
XLaccess m_xlChannelMask[2]; // CANチャンネルマスク
XLaccess m_xlChannelMask_all; // CANチャンネルマスク(全ポート)
XLportHandle m_xlPortHandle; // ポートハンドル
BOOL m_bRsvCommoActivated; // 通信FLG
void CanDriverOpen(void); // ドライバオープン
void CanTest(void); // CAN通信テスト
void CanTxMsg(void); // CANメッセージ送信
void ThreadReceiveMain(void); // CAN受信スレッド
void CanDriverClose(void); // ドライバクローズ
// ---------------------------------------------------
// 機能:メインルーチン
// ---------------------------------------------------
int main()
{
CanDriverOpen(); // ドライバオープン
CanTest(); // 通信テスト
CanDriverClose(); // ドライバクローズ
}
// ---------------------------------------------------
//ドライバクローズ
// ---------------------------------------------------
void CanDriverClose(void)
{
// 指定チャンネルを非アクティブ状態に設定
xlDeactivateChannel(m_xlPortHandle, // ポートハンドル
m_xlChannelMask_all); // アクセスするチャンネル
// ポートクローズ
xlClosePort(m_xlPortHandle);
// ドライバクローズ
xlCloseDriver();
}
各ライブラリ関数(概要)
xlDeactivateChannel | CAN通信を終了します。 引数で指定したチャンネルがCANバスから切断されます。 上記サンプルコードでは、第1回 CAN通信開始時にCAN接続したチャンネル(チャンネル1,2)を切断しています。 |
xlClosePort | CAN通信を終了するため、ポートを閉じます。 |
xlCloseDriver | 「XL Driver Library」のドライバをクローズします。 「XL Driver Library」の全API使用完了後、実行する必要があります。 |
※エラー時の処理を実装する場合、各ライブラリ関数の戻り値を元にエラー判定可能です。
補足:エラー時の処理例
第1回~第3回で紹介させていただいたサンプルコードでは、エラー発生時の処理は省略させていただきました。
エラーの有無は、各ライブラリ関数の戻り値を元に判定可能です。
実際にエラー処理を確認するための例を、以下に示します。
例:CAN通信終了時、処理が成功したかどうかを確認します。異常があった場合は、エラーの内容をテキストで表示します。
エラー時の処理なしの場合
// 指定チャンネルを非アクティブ状態に設定
xlDeactivateChannel(m_xlPortHandle, // ポートハンドル
m_xlChannelMask_all); // アクセスするチャンネル
エラー時の処理ありの場合(エラー発生させるため、関数 xlDeactivateChannel の引数に不正値を設定)
XLstatus xlStatus; // ステータス
XLstringType xlErrorText; // エラー内容
// 指定チャンネルを非アクティブ状態に設定
xlStatus = xlDeactivateChannel(0xFF, // ポートハンドル
0xFF); // アクセスするチャンネル
if (XL_SUCCESS != xlStatus)
{
xlErrorText = xlGetErrorString(xlStatus);
printf("エラー内容:%s\r\n", xlErrorText);
}
各ライブラリ関数(概要)
xlGetErrorString | 引数で指定されたエラーコードに対応する説明を、戻り値として返します。 戻り値の詳細については、Vector社の公式サイトからダウンロード可能な「XL Driver Library Manual」の「Error Codes」を参照してください。 |
実行結果
以下、上記サンプルプログラムの実行結果となります。
関数 xlDeactivateChannel の実行結果が正常(XL_SUCCESS)でなかった場合に発生したエラー内容を画面表示しています。
ここで示されているエラー内容(XL_ERR_INVALID_PORT)は、無効なポインタやインデックスを使用してポートにアクセスした際に発生するものとなります。

後がき
CAN通信終了までの処理は以上となります。
第1回~第3回を通じて、CAN通信を行うにあたり、最低限必要な処理について説明させていただきました。
少しでも皆様のお役に立てれば幸いです。
関連記事
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
-
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
【新機能探訪】Android 13から導入された『アプリごとの言語設定』
こんにちは、KNSKです。よろしくお願いします。 今回は Android13の新機能である『...
公開日:2022.12.09 更新日:2022.12.09
tag : スマートデバイス
-
こんにちは。WwWです。 システム系の開発をしていると様々な問題が起こります。 そこで今回は...
公開日:2023.04.28 更新日:2023.04.28