第4章 リファレンス
5. CanSendMessage
●Visual C# .NET(x86、x64 共用)
[DllImport(“IFCan.dll”)]
public static extern uint CanSendMessage(
IntPtr DeviceHandle, ref CAN_MESSAGE CanMessage, uint Count );
[DllImport(“IFCan.dll”)]
public static extern uint CanSendMessage(
IntPtr DeviceHandle, CAN_MESSAGE[] CanMessage, uint Count );
●Visual C# .NET(x86 専用)
[DllImport(“IFCan.dll”)]
public static extern uint CanSendMessage(
uint DeviceHandle, ref CAN_MESSAGE CanMessage, uint Count );
[DllImport(“IFCan.dll”)]
public static extern uint CanSendMessage(
uint DeviceHandle, CAN_MESSAGE[] CanMessage, uint Count );
●Visual Basic .NET(x86、x64 共用)
Declare Function CanSendMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As IntPtr, _
ByRef CanMessage As CAN_MESSAGE, _ ByVal Count As Integer _ ) As Integer
Declare Function CanSendMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As IntPtr, _
●Visual Basic .NET(x86 専用)
Declare Function CanSendMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As Integer, _
ByRef CanMessage As CAN_MESSAGE, _ ByVal Count As Integer _ ) As Integer
Declare Function CanSendMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As Integer, _
ByVal CanMessage() As CAN_MESSAGE, _ ByVal Count As Integer _ ) As Integer
【パラメータ】
hDeviceHandle
CanOpenPort 関数で取得したデバイスハンドルを指定してください。
pCanMessage
送信するメッセージを格納した構造体のポインタを指定してください。
高機能版、バスマスタ版CAN製品では、 CAN_MESSAGE構造体のulTimeメンバ変数がディレ イ時間を表します。単位は 10μsです。例えば、ulTimeに 100 を指定して、CanSendMessage 関数を呼ぶと、1ms(100×10μs)待ってから、データを送信します。設定可能範囲は 0
~1FFFFFhです。1FFFFFhより大きい値を設定しても、自動的に 1FFFFFhになります。スタ ンダード版では、CAN_MESSAGE構造体のulTimeは使用しません。設定値は無効となります。
ulCount で指定された個数分の領域を用意してください。
CAN_MESSAGE構造体の説明については、『4.3 構造体説明』をご参照ください。
ulCount
送信バッファにセットするメッセージの個数を指定してください。
【戻り値】
正常終了した場合は、IFCAN_ERROR_SUCCESSが返されます。
IFCAN_ERROR_SUCCESS以外の値が返された場合については、『4.4 戻り値一覧』をご参照くださ い。
【使用例】
●C 言語 INT nRet;
CAN_MESSAGE CanMessage[10];
HANDLE hDeviceHandle;
unsigned long ulSendValue;
hDeviceHandle = CanOpenPort(“IFCAN1”);
: :
for (i=0;i<10;i++) {
// 送信メッセージ長のセット CanMessage[i].ulLength = 4;
// 送信メッセージの ID をセット
CanMessage[i].ulID = 0x01 | CAN_EXT_FRAME;
// フラグの設定
CanMessage[i].ulFlag = 0;
// ディレイ時間なし(高機能版、バスマスタ版 CAN 製品のみ有効) CanMessage[i].ulTime = 0;
// 送信メッセージの内容をコピー
*(unsigned long*)CanMessage[i].bData = ulSendValue;
}
nRet = CanActivate(hDeviceHandle);
// 送信メッセージのセット(送信開始)
nRet = CanSendMessage(hDeviceHandle, CanMessage, 10);
●Visual Basic
Dim lpszName As String Dim hDeviceHandle As Long
Dim CanMessage(0 To 9) As CAN_MESSAGE Dim bSendValue(0 To 3) As Byte
Dim nRet As Long
lpszName = "IFCAN1" & Chr( 0 )
hDeviceHandle = CanOpenPort(lpszName) :
:
For i = 0 To 9
‘ 送信メッセージ長のセット CanMessage(i).ulLength = 4 ‘ 送信メッセージの ID をセット
CanMessage(i).ulID = &H01 Or CAN_EXT_FRAME ‘ フラグの設定
CanMessage(i).ulFlag = 0
‘ ディレイ時間なし(高機能版、バスマスタ版 CAN 製品のみ有効) CanMessage(i).ulTime = 0
‘ 送信メッセージの内容をコピー
CanMessage(i).bData(0) = bSendValue(0) CanMessage(i).bData(1) = bSendValue(1) CanMessage(i).bData(2) = bSendValue(2) CanMessage(i).bData(3) = bSendValue(3) Next
nRet = CanActivate(hDeviceHandle)
‘ 送信メッセージのセット(送信開始)
nRet = CanSendMessage(hDeviceHandle, CanMessage(0), 10)
●Delphi var
lpszName: String;
hDeviceHandle: THandle;
CanMessage: array[0..9] of CAN_MESSAGE;
bSendValue: array[0..3] of Byte;
nRet: Integer;
i: Integer;
lpszName := ‘IFCAN1’;
hDeviceHandle := CanOpenPort(lpszName);
: :
for i := 0 to 9 do begin // 送信メッセージ長のセット CanMessage[i].ulLength := 4;
// 送信メッセージの ID をセット
CanMessage[i].ulID := $01 | CAN_EXT_FRAME;
// フラグの設定
CanMessage[i].ulFlag := 0;
// ディレイ時間なし(高機能版、バスマスタ版 CAN 製品のみ有効) CanMessage[i].ulFlag := 0;
// 送信メッセージの内容をコピー
CanMessage[i].bData[0] := bSendValue[0];
CanMessage[i].bData[1] := bSendValue[1];
CanMessage[i].bData[2] := bSendValue[2];
CanMessage[i].bData[3] := bSendValue[3];
end;
nRet := CanActivate(hDeviceHandle);
// 送信メッセージのセット(送信開始)
nRet := CanSendMessage(hDeviceHandle, CanMessage[0], 10);
●Visual C# .NET uint Ret;
IFCCAN_ANY.CAN_MESSAGE[] CanMessage = new IFCCAN_ANY.CAN_MESSAGE[10];
IntPtr DeviceHandle;
byte SendValue;
int i;
DeviceHandle = IFCCAN_ANY.CanOpenPort(“IFCAN1”);
:
for (i = 0; i < 10; i++) {
// Data 配列の初期化
CanMessage[i].InitializeArray();
// 送信メッセージ長のセット CanMessage[i].Length = 1;
// 送信メッセージの ID をセット
CanMessage[i].ID = 0x01 | IFCCAN_ANY.CAN_EXT_FRAME;
// フラグの設定
CanMessage[i].Flag = 0;
// ディレイ時間なし(高機能版、バスマスタ版 CAN 製品のみ有効) CanMessage[i].Time = 0;
// 送信メッセージの内容をコピー CanMessage[i].Data[0] = SendValue;
}
Ret = IFCCAN_ANY.CanActivate(DeviceHandle);
// 送信メッセージのセット(送信開始)
Ret = IFCCAN_ANY.CanSendMessage(DeviceHandle, CanMessage, 10);
●Visual Basic .NET
Dim DeviceHandle As Integer
Dim CanMessage(9) As IFCCAN_ANY.CAN_MESSAGE Dim SendValue As Byte
Dim Ret As Integer
DeviceHandle = CanOpenPort(“IFCAN1”) :
For i = 0 To 9 ‘ Data 配列の初期化
CanMessage(i).InitializeArray() ‘ 送信メッセージ長のセット CanMessage(i).Length = 4 ‘ 送信メッセージの ID をセット
CanMessage(i).ID = &H01 Or IFCCAN_ANY.CAN_EXT_FRAME ‘ フラグの設定
CanMessage(i).Flag = 0
‘ ディレイ時間なし(高機能版、バスマスタ版 CAN 製品のみ有効) CanMessage(i).Time = 0
‘ 送信メッセージの内容をコピー CanMessage(i).Data(0) = SendValue Next
Ret = IFCCAN_ANY.CanActivate(DeviceHandle)
‘ 送信メッセージのセット(送信開始)
Ret = IFCCAN_ANY.CanSendMessage(DeviceHandle, CanMessage, 10)
●Visual C++ CLR プロジェクト unsigned int Ret;
array<IFCCAN_ANY::CAN_MESSAGE>^ CanMessage =
gcnew array<IFCCAN_ANY::CAN_MESSAGE>(10);
IntPtr DeviceHandle;
unsigned char SendValue;
int i;
DeviceHandle = IFCCAN_ANY::CanOpenPort(“IFCAN1”);
:
for (i = 0; i < 10; i++) {
// Data 配列の初期化
CanMessage[i].InitializeArray();
// 送信メッセージ長のセット CanMessage[i].Length = 1;
// 送信メッセージの ID をセット
CanMessage[i].ID = 0x01 | IFCCAN::CAN_EXT_FRAME;
// フラグの設定
CanMessage[i].Flag = 0;
// ディレイ時間なし(高機能版、バスマスタ版 CAN 製品のみ有効) CanMessage[i].Time = 0;
// 送信メッセージの内容をコピー CanMessage[i].Data[0] = SendValue;
}
Ret = IFCCAN_ANY::CanActivate(DeviceHandle);
// 送信メッセージのセット(送信開始)
Ret = IFCCAN_ANY::CanSendMessage(DeviceHandle, CanMessage, 10);
デバイス名「IFCAN1」の CAN インタフェースから 10 件のメッセージ送信を行います。