Avance.Lab

技術紹介

第3回 Vector CAN ライブラリを用いたCAN通信

公開日:2025.06.27 更新日:2025.06.27

tag: ToolCANWindows

こんにちは、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();
}

各ライブラリ関数(概要)

xlDeactivateChannelCAN通信を終了します。
引数で指定したチャンネルがCANバスから切断されます。
上記サンプルコードでは、第1回 CAN通信開始時にCAN接続したチャンネル(チャンネル1,2)を切断しています。
xlClosePortCAN通信を終了するため、ポートを閉じます。
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通信を行うにあたり、最低限必要な処理について説明させていただきました。
少しでも皆様のお役に立てれば幸いです。

OT

組み込み開発をメインに担当しています

関連記事