CanReceive


機能

CAN, もしくはCAN FD受信メッセージを取得します。

書式

Ret = CanReceive ( Id , ChannelNo , MessageNum , MessageType , CanId , DataLength , Data , ErrorCode , TickCount )

引数

Id [ VB.NET: Short ] [ C, C++: short ] [ C#: short ]
CanInitで取得したデバイスIDを指定します。

ChannelNo [ VB.NET: UShort ] [ C, C++: unsigned short ] [ C#: ushort ]
チャネル番号を指定します。

MessageNum [ VB.NET: UInteger ] [ C, C++: unsigned long * ] [ C#: out uint ]
有効な受信メッセージ数を格納するアドレスを指定します。
用意した受信メッセージ数(配列数)を格納したメモリアドレスを指定し、関数を呼び出します。

関数処理内で受信メッセージ数(配列数)の範囲内で受信済みメッセージを格納します。
また、MessageNumに有効な受信メッセージ数が上書きされ、関数処理が戻ります。

格納される範囲は、1~170となります。

MessageType [ VB.NET: UInteger ] [ C, C++: unsigned long * ] [ C#: out uint ]
受信メッセージタイプを格納する1次元配列の先頭アドレスを指定します。
複数のメッセージタイプが有効の場合は、論理和(OR)でビット演算された状態で、関数処理が戻ります。

定義


[Hex]

意味

CCAN_MSG_TYPE_CAN

0x01

CANメッセージ

CCAN_MSG_TYPE_CAN_FD

0x02

CAN FDメッセージ

CCAN_MSG_TYPE_REMOTE_FRAME

0x04

リモートフレーム。 ※CANのみ有効にできます

CCAN_MSG_TYPE_BITRATE_SWITCH

0x08

ビットレートスイッチ。 ※CAN FDのみ有効にできます

CCAN_MSG_TYPE_EXTENDED_FORMAT

0X20

拡張フォーマット

CanId [ VB.NET: UInteger ] [ C, C++: unsigned long * ] [ C#:out uint ]
受信したCAN IDを格納する1次元配列の先頭アドレスを指定します。

標準フォーマットが指定されている場合は、ベースID(11bit)で指定されます。
有効な指定範囲は、0x000~0x7FFです。

拡張フォーマットが指定されている場合は、拡張ID + ベースID (合計29bit)で指定されます。
有効な指定範囲は、0x000~0x1FFFFFFFです。

CanIdのビット番号

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

09

08

07

06

05

04

03

02

01

00

拡張ID/ベースID

-

-

-

拡張ID

ベースID

各IDのビット番号

-

-

-

17

16

15

14

13

12

11

10

09

08

07

06

05

04

03

02

01

00

10

09

08

07

06

05

04

03

02

01

00

DataLength [ VB.NET: UShort ] [ C, C++: unsigned short * ] [ C#: out ushort ]
受信したメッセージデータ長を格納する一次元配列の先頭アドレスを指定します。

CAN通信が指定されている場合、有効な範囲は0~8です。
CAN FD通信が指定されている場合、有効な範囲は0~8、および、12, 16, 20, 24, 32, 48, 64です。

Data [ VB.NET: Byte ] [ C, C++: unsigned char * ] [ C#: out byte ]
受信したデータを格納する2次元配列の先頭アドレスを指定します。
2次元配列の要素数(列数)は64です。

ErrorCode [ VB.NET: UShort ] [ C, C++: unsigned short * ] [ C#: out ushort ]
CAN通信で、各受信メッセージを受信した際に発生したエラーを格納する一次元配列の先頭アドレスを指定します。

定義

戻り値
[Dec]

内容

CCAN_STATUS_ERR_SUCCESS

0

正常

CCAN_STATUS_ERR_BIT

1

ビットエラー
エラーフレームのためTickCount 以外の引数は、無効データとなります。

CCAN_STATUS_ERR_FORM

2

フォームエラー
エラーフレームのためTickCount 以外の引数は、無効データとなります。

CCAN_STATUS_ERR_STUFF

3

スタッフエラー
エラーフレームのためTickCount 以外の引数は、無効データとなります。

CCAN_STATUS_ERR_ACK

4

ACKエラー
エラーフレームのためTickCount 以外の引数は、無効データとなります。

CCAN_STATUS_ERR_CRC

5

CRCエラー
エラーフレームのためTickCount 以外の引数は、無効データとなります。

CCAN_STATUS_ERR_OTHER

6

その他エラー
エラーフレームのためTickCount 以外の引数は、無効データとなります。

TickCount [ VB.NET: UInteger ] [ C, C++: unsigned long * ] [ C#:out uint ]
受信時のティックカウント値を格納する一次元配列の先頭アドレスを格納します。
単位は nsecとなります。

戻り値

Ret [ VB.NET: Integer ] [ C, C++: long ] [ C#: int ]

定義

[Dec]

意味

CAN_ERR_SUCCESS

0

正常終了

CAN_ERR_SYS_RECOVERED_FROM_STANDBY

7

スタンバイモードから復帰したため、DioResetDevice関数を実行してください

CAN_ERR_DLL_INVALID_ID

10001

無効なIDが指定されました。

CAN_ERR_DLL_CALL_DRIVER

10002

ドライバーを呼び出せません(デバイスI/Oコントロールに失敗)。

CAN_ERR_DLL_BUFF_ADDRESS

10100

データバッファアドレスが不正です。

CAN_ERR_SYS_CH_NO

20101

チャネル番号が設定可能範囲外です

CAN_ERR_SYS_MESSAGE_NUM

20150

メッセージ数が設定可能範囲外です。

CAN_ERR_SYS_REC_FIFO_OVERFLOW

20220

受信FIFOがオーバーフローしました。

CAN_ERR_SYS_BUSOFF

20201

バスオフのため実行できません。

CAN_ERR_SYS_BUS_DISCONNECT

20202

バス未接続のため実行できません。

その他のエラー(参照:エラーコード詳細

初期値

なし

説明

CAN, もしくはCAN FD受信メッセージを取得します。

戻り値が正常な場合、取得した各受信メッセージを確認する前に ErrorCode 引数がCCAN_STATUS_ERR_SUCCESSであることを確認してください。
それ以外の場合には、他の引数で取得できるデータは無効データとなります。

メッセージタイプ(MessageType)、CAN ID(CanId)、データー長(DataLength)、エラーコード(ErrorCode)、ティックカウント(TickCount)は、1次元配列でメモリを確保し数値を指定し、先頭アドレスを引数とします。
1次元配列のインデックスにメッセージ番号を指定すれば、対象メッセージ番号に対する値を参照できます。

1次元配列のイメージ

配列変数名[メッセージ番号]

要素の値(例)

MessageType[0]

CCAN_MSG_TYPE_CAN

MessageType[1]

CCAN_MSG_TYPE_CAN

MessageType[2]

CCAN_MSG_TYPE_CAN

MessageType[3]

CCAN_MSG_TYPE_CAN

・・・

・・・

MessageType[MessageNum - 1]

CCAN_MSG_TYPE_CAN

 

受信データ(Data)は、64個の要素を持つ2次元配列でメモリを確保し、先頭アドレスを引数とします。
2次元配列の第1インデックスにメッセージ番号を指定すれば、個々のメッセージ番号に対する受信データが参照できます。
2次元配列の第2インデックスに要素番号を指定すれば、個々の要素値が参照できます。


2次元配列のイメージ

配列変数名[メッセージ番号][(要素番号)]

要素01の値

要素02の値

要素03の値

・・・

要素64の値

Data[0][]

Data[0][0]

Data[0][1]

Data[0][2]

・・・

Data[0][63]

Data[1][]

Data[1][0]

Data[1][1]

Data[1][2]

・・・

Data[1][63]

Data[2][]

Data[2][0]

Data[2][1]

Data[2][2]

・・・

Data[2][63]

Data[3][]

Data[3][0]

Data[3][1]

Data[3][2]

・・・

Data[3][63]

・・・

・・・

・・・

・・・

・・・

・・・

Data[MessageNum - 1][]

Data[MessageNum - 1][0]

Data[MessageNum - 1][1]

Data[MessageNum - 1][2]

・・・

Data[MessageNum - 1][63]

 

使用例

ChannelNo = 1のCAN受信メッセージを取得します。MessageNum =1、MessageType = CCAN_MSG_TYPE_CAN、CAN ID = 0x11c、DataLength = 1 、Data = 0xff

VB.NET

Dim Ret As Integer

Dim MessageNum As UInteger

Dim MessageType(0) As UInteger

Dim CanId(0) As UInteger

Dim DataLength(0) As UShort

Dim Data(0)(63) As Byte

Dim ErrorCode(0) As UShort

Dim TickCount(0) As UInteger

 

MessageNum = 1

 

Ret = CanReceive ( Id , 1 , MessageNum , MessageType , CanId , Data , ErrorCode , TickCount )
 

C, C++

long Ret;

unsigned long MessageNum;

unsinged long MessageType[1];

unsinged long CanId[1];

unsinged short DataLength[1];

unsinged char Data[1][64];

unsinged short ErrorCode[1];

unsinged long TickCount[1];

 

MessageNum = 1;

 


Ret = CanTransmit ( Id , 1 , &MessageNum , &MessageType[0] , &CanId[0] , &Data[0][0] , &ErrorCode[0] , &TickCount[0] );
 

C#

int Ret;

uint MessageNum = new unit;

uint[] MessageType = new unit[1];

uint[] CanId = new uint[1];

ushort[] DataLength = new ushort[1];

ubyte[,] Data = new ubyte[1,64];

ushort[] ErrorCode = new ushort[1];

uint[] TickCount = new uint[1];

 

MessageNum = 1;


Ret = can.Transmit ( Id , 1 , out MessageNum , out MessageType , out CanId , out Data , out ErrorCode , out TickCount);
 

関連項目

CanTransit