CAN, もしくはCAN FD受信メッセージを取得します。
Ret = CanReceive ( Id , ChannelNo , MessageNum , MessageType , CanId , DataLength , Data , ErrorCode , TickCount )
Id
[ C: short ] [ Python: ctypes.c_short ]
CanInitで取得したデバイスIDを指定します。
ChannelNo
[ C: unsigned short ] [ Python: ctypes.c_ushort ]
チャネル番号を指定します。
MessageNum
[ C:unsigned int *] [ Python: ctypes.POINTER(ctypes.c_uint) ]
有効な受信メッセージ数を格納するアドレスを指定します。
用意した受信メッセージ数(配列数)を格納したメモリアドレスを指定し、関数を呼び出します。
関数処理内で受信メッセージ数(配列数)の範囲内で受信済みメッセージを格納します。
また、MessageNumに有効な受信メッセージ数が上書きされ、関数処理が戻ります。
格納される範囲は、1~170となります。
MessageType
[ C:unsigned int *] [ Python: ctypes.POINTER(ctypes.c_uint) ]
受信メッセージタイプを格納する1次元配列の先頭アドレスを指定します。
複数のメッセージタイプが有効の場合は、論理和(OR)でビット演算された状態で、関数処理が戻ります。
定義 |
値 |
意味 |
CCAN_MSG_TYPE_CAN |
0x01 |
CANメッセージ |
CCAN_MSG_TYPE_CAN_FD |
0x02 |
CAN FDメッセージ |
CCAN_MSG_TYPE_REMOTE_FRAME |
0x04 |
リモートフレーム |
CCAN_MSG_TYPE_BITRATE_SWITCH |
0x08 |
ビットレートスイッチ |
CCAN_MSG_TYPE_EXTENDED_FORMAT |
0X20 |
拡張フォーマット |
CanId [
C:unsigned int *] [ Python: ctypes.POINTER(ctypes.c_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
[ C:unsigned short *] [ Python: ctypes.POINTER(ctypes.c_ushort)
]
受信したメッセージデータ長を格納する一次元配列の先頭アドレスを指定します。
CAN通信が指定されている場合、有効な範囲は0~8です。
CAN FD通信が指定されている場合、有効な範囲は0~8、および、12, 16, 20, 24, 32, 48, 64です。
Data [
C:unsigned char *] [ Python: ctypes.POINTER(ctypes.c_ubyte) ]
受信したデータを格納する2次元配列の先頭アドレスを指定します。
2次元配列の要素数(列数)は64です。
ErrorCode
[ C:unsigned int *] [ Python: ctypes.POINTER(ctypes.c_uint)
]
CAN通信で、各受信メッセージを受信した際に発生したエラーを格納する一次元配列の先頭アドレスを指定します。
定義 |
戻り値 |
内容 |
CCAN_STATUS_ERR_SUCCESS |
0 |
正常 |
CCAN_STATUS_ERR_BIT |
1 |
ビットエラー |
CCAN_STATUS_ERR_FORM |
2 |
フォームエラー |
CCAN_STATUS_ERR_STUFF |
3 |
スタッフエラー |
CCAN_STATUS_ERR_ACK |
4 |
ACKエラー |
CCAN_STATUS_ERR_CRC |
5 |
CRCエラー |
CCAN_STATUS_ERR_OTHER |
6 |
その他エラー |
TickCount
[ C:unsigned long long *] [ Python: ctypes.POINTER(ctypes.c_ulonglong)
]
受信時のティックカウント値を格納する一次元配列の先頭アドレスを格納します。
単位は nsecとなります。
Ret [ C: long ] [ Python: ctypes.c_long ]
定義 |
値 [Dec] |
意味 |
CAN_ERR_SUCCESS |
0 |
正常終了 |
CAN_ERR_SYS_RECOVERED_FROM_STANDBY |
7 |
スタンバイモードから復帰したため、CanResetDevice関数を実行してください |
CAN_ERR_DLL_INVALID_ID |
10001 |
無効なIDが指定されました。 |
CAN_ERR_DLL_CALL_DRIVER |
10002 |
ドライバを呼び出せません(ioctlに失敗)。 |
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
C |
long Ret; unsigned int MessageNum; unsinged int MessageType[1]; unsinged int CanId[1]; unsinged short DataLength[1]; unsinged char Data[1][64]; unsinged long long TickCount[1]; MessageNum = 1;
|
Python |
Ret = ctypes.c_long() MessageNum = ctypes.c_uint() MessageTypeType = ctypes.c_uint() * 1 MessageType = MessageTypeType() CanIdType = ctypes.c_uint() * 1 CanId = CanIdType() DataLengthType = ctypes.c_ushort() *1 DataLength = DataLengthType() SingleDataType = ctypes.c_ubyte() * 64 DataType = ctypes.SingleDataType * 1 Data = DataType()
ErrorCodeType = = ctypes.c_uint() * 1 ErrorCode = ErrorCodeType()
TickCountType = ctypes.c_ulonglong() * 1 TickCount = TickCountType()
MessageNum = 1
Ret.value = ccan.CanReceive
( Id , 1 , ctypes.byref(MessageNum) , MessageType , CanId , Data
, ErrorCode , TickCount) |