第4章 リファレンス
7. CanReceiveMessage
●Visual C# .NET(x86、x64 共用)
[DllImport(“IFCan.dll”)]
public static extern uint CanReceiveMessage(
IntPtr DeviceHandle, out CAN_MESSAGE CanMessage, ref uint Count );
[DllImport(“IFCan.dll”)]
public static extern uint CanReceiveMessage(
IntPtr DeviceHandle, [Out] CAN_MESSAGE[] CanMessage, ref uint Count );
●Visual C# .NET(x86 専用)
[DllImport(“IFCan.dll”)]
public static extern uint CanReceiveMessage(
uint DeviceHandle, out CAN_MESSAGE CanMessage, ref uint Count );
[DllImport(“IFCan.dll”)]
public static extern uint CanReceiveMessage(
uint DeviceHandle, [Out] CAN_MESSAGE[] CanMessage, ref uint Count );
●Visual Basic .NET(x86、x64 共用)
Declare Function CanReceiveMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As IntPtr, _
ByRef CanMessage As CAN_MESSAGE, _ ByRef Count As Integer _
) As Integer
Declare Function CanReceiveMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As IntPtr, _
<Out()> ByVal CanMessage() As CAN_MESSAGE, _ ByRef Count As Integer _
) As Integer
●Visual Basic .NET(x86 専用)
Declare Function CanReceiveMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As Integer, _
ByRef CanMessage As CAN_MESSAGE, _ ByRef Count As Integer _
) As Integer
Declare Function CanReceiveMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As Integer, _
<Out()> ByVal CanMessage() As CAN_MESSAGE, _ ByRef Count As Integer _
) As Integer
【パラメータ】
hDeviceHandle
CanOpenPort 関数で取得したデバイスハンドルを指定してください。
pCanMessage
受信メッセージを格納する構造体へのポインタを指定してください。
pCount で指定された個数分の領域を用意してください。
CAN_MESSAGE構造体の説明については、『4.3 構造体説明』をご参照ください。
pulCount
受信バッファから取り出すメッセージの件数を指定してください。
(1~CanSetConfig 関数で設定した受信バッファのサイズ(デフォルト:64))
受信バッファに蓄えられているメッセージが指定された件数よりも少ない場合、実際に 受信バッファから取り出された件数が、この変数に返されます。
例)PortStatus.ulRXBCount が 8 の時に、pulCount に 10 をセットし、CanReceiveMessage 関数を実行すると、pulCount に 8 が返され、正常終了します。
【戻り値】
正常終了した場合は、IFCAN_ERROR_SUCCESSが返されます。
IFCAN_ERROR_SUCCESS以外の値が返された場合については、『4.4 戻り値一覧』をご参照くださ い。
【使用例】
●C 言語 INT nRet;
CAN_MESSAGE CanMessage[10];
unsigned long ulCount;
HANDLE hDeviceHandle;
hDeviceHandle = CanOpenPort(“IFCAN1”);
: :
// 受信メッセージの取り出し ulCount = 10;
nRet = CanReceiveMessage(hDeviceHandle, CanMessage, &ulCount);
if (nRet != IFCAN_ERROR_SUCCESS) {
if (nRet == IFCAN_ERROR_BUFFER_IS_EMPTY) { printf(“受信メッセージがありません”);
}
} else {
for (i=0; i<ulCount; i++) {
printf(“受信メッセージ長 : %ld\n”,CanMessage[i].ulLength);
printf(“ID : %lx\n”,CanMessage[i].ulID);
printf(“受信データ : “);
for (j=0;i<CanMessage[i].ulLength;j++) { printf(“%02x “,CanMessage[i].bData[j]);
}
printf(“\n”);
} }
Dim lpszName As String Dim lpszMessage As String Dim hDeviceHandle As Long
Dim CanMessage(0 To 9) As CAN_MESSAGE Dim ulCount As Long
lpszName = "IFCAN1" & Chr( 0 )
hDeviceHandle = CanOpenPort(lpszName) :
:
ulCount = 10
‘ 受信メッセージの取り出し
nRet = CanReceiveMessage(hDeviceHandle, CanMessage(0), ulCount) If nRet <> IFCAN_ERROR_SUCCESS Then
If nRet = IFCAN_ERROR_BUFFER_IS_EMPTY Then MsgBox(“受信メッセージがありません”) End If
Else
For i=0 To ulCount - 1
lpszMessage = lpszMessage & Str(i+1) & “件目のメッセージ” & vbCrLf & _
“受信メッセージ長 : “ & Str(CanMessage(i).ulLength) & vbCrLf & _
“ID : “ & Str(CanMessage(i).ulID) & vbCrLf & “受信データ : “ For j=0 To CanMessage(i).ulLength - 1
lpszMessage = lpszMessage & Hex(CanMessage(i).bData(j)) & “ “ Next
lpszMessage = lpszMessage & vbCrLf Next
MsgBox(lpszMessage) End If
var
lpszName: String;
lpszMessage: String;
hDeviceHandle: THandle;
CanMessage: array[0..9] of CAN_MESSAGE;
nRet: Integer;
ulCount: ULONG;
i: Integer;
j: Integer;
lpszName := ‘IFCAN1’;
hDeviceHandle := CanOpenPort(lpszName);
: :
ulCount := 10;
nRet := CanReceiveMessage(hDeviceHandle, CanMessage[0], ulCount);
if nRet <> IFCAN_ERROR_SUCCESS then begin
if nRet = IFCAN_ERROR_BUFFER_IS_EMPTY then begin
MessageDlg(‘受信メッセージがありません’, mtError, [mbOK], 0);
end else
for i := 0 To ulCount - 1 do begin
lpszMessage := IntToStr(ulCount) + ‘件目のメッセージ\n’;
lpszMessage := lpszMessage + ‘ 受 信 メ ッ セ ー ジ 長 : ‘ + IntToStr(CanMessage[i].ulLength) + ‘\n’;
lpszMessage := lpszMessage + ‘ID : ‘ + IntToStr(CanMessage[i].ulID) + ‘\n’;
lpszMessage := lpszMessage + ‘受信データ : ‘;
for j := 0 To CanMessage[i].ulLength - 1 do begin
lpszMessage := lpszMessage + IntToHex(CanMessage[i].bData[j], 2) + ‘ ‘;
end;
MessageDlg(lpszMessage, mtInformation, [mbOK], 0);
end;
end;
end;
●Visual C# .NET uint Ret;
IFCCAN_ANY.CAN_MESSAGE[] CanMessage = new IFCCAN_ANY.CAN_MESSAGE[10];
uint Count;
IntPtr DeviceHandle;
string Message = “”;
int i;
uint j;
for(i = 0; i < 10; i++) {
CanMessage[i].InitializeArray();
}
DeviceHandle = IFCCAN_ANY.CanOpenPort(“IFCAN1”);
:
// 受信メッセージの取り出し Count = 10;
Ret = IFCCAN_ANY.CanReceiveMessage(DeviceHandle, CanMessage, ref Count);
if(Ret != IFCCAN_ANY.IFCAN_ERROR_SUCCESS) {
if(Ret == IFCCAN_ANY.IFCAN_ERROR_BUFFER_IS_EMPTY) {
MessageBox.Show(“受信メッセージがありません”);
} } else {
for(i = 0; i < ulCount; i++) {
Message = “受信メッセージ長 : ” + CanMessage[i].Length.ToString();
MessageBox.Show(Message);
Message = “ID : ” + CanMessage[i].ID.ToString();
MessageBox.Show(szMessage);
Message = “受信データ : “;
for(j = 0; j < CanMessage[i].Length; j++) {
Message += CanMessage[i].Data[j].ToString();
}
●Visual Basic .NET Dim Message As String Dim DeviceHandle As Integer
Dim CanMessage(9) As IFCCAN_ANY.CAN_MESSAGE Dim Count As Integer
Dim i As Integer Dim j As Integer Dim Ret As Integer for i = 0 To 9
CanMessage(i).InitializeArray() Next
DeviceHandle = IFCCAN_ANY.CanOpenPort(“IFCAN1”) :
Count = 10
‘ 受信メッセージの取り出し
Ret = IFCCAN_ANY.CanReceiveMessage(DeviceHandle, CanMessage, Count) If Ret <> IFCCAN_ANY.IFCAN_ERROR_SUCCESS Then
If Ret = IFCCAN_ANY.IFCAN_ERROR_BUFFER_IS_EMPTY Then MsgBox(“受信メッセージがありません”)
End If Else
For i = 0 To Count – 1
Message = Message & Str(i + 1) & “件目のメッセージ” & vbCrLf & _ “受信メッセージ長 : “ & Str(CanMessage(i).Length) & vbCrLf & _ “ID : “ & Str(CanMessage(i).ID) & vbCrLf & “受信データ : “ For j = 0 To CanMessage(i).Length
Message = Message & Hex(CanMessage(i).Data(j)) & “ “ Next
Message = Message & vbCrLf Next
MsgBox(Message) End If
●Visual C++ CLR プロジェクト unsigned int Ret;
array<IFCCAN_ANY::CAN_MESSAGE>^ CanMessage =
gcnew array<IFCCAN_ANY::CAN_MESSAGE>(10);
unsigned int Count;
IntPtr DeviceHandle;
String^ Message = “”;
unsigned int i;
unsigned int j;
for(i = 0; i < 10; i++) {
CanMessage[i].InitializeArray();
}
DeviceHandle = IFCCAN_ANY::CanOpenPort(“IFCAN1”);
:
// 受信メッセージの取り出し Count = 10;
Ret = IFCCAN_ANY::CanReceiveMessage(DeviceHandle, CanMessage, Count);
if(Ret != IFCCAN_ANY::IFCAN_ERROR_SUCCESS) {
if(Ret == IFCCAN_ANY::IFCAN_ERROR_BUFFER_IS_EMPTY) {
MessageBox::Show(“受信メッセージがありません”);
} } else {
for(i = 0; i < Count; i++) {
Message = “受信メッセージ長 : ” + CanMessage[i].Length.ToString();
MessageBox::Show(Message);
Message = “ID : ” + CanMessage[i].ID.ToString();
MessageBox::Show(Message);
Message = “受信データ : “;
for(j = 0; j < CanMessage[i].Length; j++) {
Message += CanMessage[i].Data[j].ToString();