C#/XL_Driver
7. 채널 정보 출력(CAN_FD)
소송왕잡스
2020. 2. 10. 17:14
CAN_FD의 채널 정보를 포함하는 class 구조는 다음과 같습니다
public class xl_channel_config
{
public string name;
public string transceiverName;
public uint articleNumber;
public uint serialNumber;
public uint[] raw_data;
public XLDefine.XL_InterfaceVersion interfaceVersion;
public uint driverVersion;
public xl_bus_params busParams;
public XLDefine.XL_BusTypes connectedBusType;
public uint[] reserved;
public byte isOnBus;
public XLDefine.XL_ChannelCapabilities channelCapabilities;
public ulong channelMask;
public byte channelIndex;
public XLDefine.XL_Transceiver_Status transceiverState;
public XLDefine.XL_Transceiver_Types transceiverType;
public byte hwChannel;
public byte hwIndex;
public XLDefine.XL_HardwareType hwType;
public XLDefine.XL_BusCapabilities channelBusCapabilities;
public xl_channel_config();
}
이들 중, define, class 혹은 struct, 배열 자료형을 제외한 나머지 값들을 출력하면 다음과 같다
※ 참고 : 연결된 장치는 VN1630A와 VN1640A 각 1개씩 입니다.
출력 결과
-------------------------------------------------------------------
xlCANFDdemo.NET C# V11.0
Copyright (c) 2019 by Vector Informatik GmbH. All rights reserved.
-------------------------------------------------------------------
vxlapi_NET : 11.0.14.22309
Open Driver : XL_SUCCESS
Get Driver Config : XL_SUCCESS
DLL Version : 11.0.14
Channels found : 12
[0] VN1630A Channel 1
- CAN FD Support : yes
- Name : VN1630A Channel 1
- Transciver Name : CANpiggy 1055cap (Lowspeed)
- Article Number : 7113
- Serial Number : 540600
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 3791683607
- Channel Mask : 1
- Channel Index : 0
- Hw Channel : 0
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1630
[1] VN1630A Channel 2
- CAN FD Support : yes
- Name : VN1630A Channel 2
- Transciver Name : On board CAN 1051cap(Highspeed)
- Article Number : 7113
- Serial Number : 540600
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 3791683607
- Channel Mask : 2
- Channel Index : 1
- Hw Channel : 1
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1630
[2] VN1630A Channel 3
- CAN FD Support : yes
- Name : VN1630A Channel 3
- Transciver Name : On board CAN 1051cap(Highspeed)
- Article Number : 7113
- Serial Number : 540600
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 3791683607
- Channel Mask : 4
- Channel Index : 2
- Hw Channel : 2
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1630
[3] VN1630A Channel 4
- CAN FD Support : no
- Name : VN1630A Channel 4
- Transciver Name :
- Article Number : 7113
- Serial Number : 540600
- Interface Version : 0
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 1073741831
- Channel Mask : 8
- Channel Index : 3
- Hw Channel : 3
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1630
[4] VN1630A Channel 5
- CAN FD Support : no
- Name : VN1630A Channel 5
- Transciver Name : On board D/A IO 1021
- Article Number : 7113
- Serial Number : 540600
- Interface Version : XL_INTERFACE_VERSION_V3
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 1073774599
- Channel Mask : 16
- Channel Index : 4
- Hw Channel : 4
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1630
[5] VN1640A Channel 1
- CAN FD Support : yes
- Name : VN1640A Channel 1
- Transciver Name : CANpiggy 1057Gcap (Highspeed)
- Article Number : 7114
- Serial Number : 26638
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 3791683607
- Channel Mask : 32
- Channel Index : 5
- Hw Channel : 0
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1640
[6] VN1640A Channel 2
- CAN FD Support : yes
- Name : VN1640A Channel 2
- Transciver Name : CANpiggy 1057Gcap (Highspeed)
- Article Number : 7114
- Serial Number : 26638
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 3791683607
- Channel Mask : 64
- Channel Index : 6
- Hw Channel : 1
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1640
[7] VN1640A Channel 3
- CAN FD Support : yes
- Name : VN1640A Channel 3
- Transciver Name : CANpiggy 1057Gcap (Highspeed)
- Article Number : 7114
- Serial Number : 26638
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 3791683607
- Channel Mask : 128
- Channel Index : 7
- Hw Channel : 2
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1640
[8] VN1640A Channel 4
- CAN FD Support : yes
- Name : VN1640A Channel 4
- Transciver Name : CANpiggy 1057Gcap (Highspeed)
- Article Number : 7114
- Serial Number : 26638
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 3791683607
- Channel Mask : 256
- Channel Index : 8
- Hw Channel : 3
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1640
[9] VN1640A Channel 5
- CAN FD Support : no
- Name : VN1640A Channel 5
- Transciver Name : On board D/A IO 1021
- Article Number : 7114
- Serial Number : 26638
- Interface Version : XL_INTERFACE_VERSION_V3
- Driver Version : 168361996
- isOnBus : 0
- Capabilities : 1073774599
- Channel Mask : 512
- Channel Index : 9
- Hw Channel : 4
- Hw Index : 0
- Hw Type : XL_HWTYPE_VN1640
[10] Virtual Channel 1
- CAN FD Support : yes
- Name : Virtual Channel 1
- Transciver Name : Virtual CAN
- Article Number : 0
- Serial Number : 0
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 184680464
- isOnBus : 0
- Capabilities : 2684354567
- Channel Mask : 1024
- Channel Index : 10
- Hw Channel : 0
- Hw Index : 0
- Hw Type : XL_HWTYPE_VIRTUAL
[11] Virtual Channel 2
- CAN FD Support : yes
- Name : Virtual Channel 2
- Transciver Name : Virtual CAN
- Article Number : 0
- Serial Number : 0
- Interface Version : XL_INTERFACE_VERSION_V4
- Driver Version : 184680464
- isOnBus : 0
- Capabilities : 2684354567
- Channel Mask : 2048
- Channel Index : 11
- Hw Channel : 1
- Hw Index : 0
- Hw Type : XL_HWTYPE_VIRTUAL
APPLICATION CONFIGURATION
-------------------------------------------------------------------
Configured Hardware Channel : VN1640A Channel 2
Hardware Driver Version : 10.9.12
Used Transceiver : CANpiggy 1057Gcap (Highspeed)
-------------------------------------------------------------------
Configured Hardware Channel : VN1630A Channel 2
Hardware Driver Version : 10.9.12
Used Transceiver : On board CAN 1051cap(Highspeed)
-------------------------------------------------------------------
Open Port : XL_SUCCESS
Set CAN FD Config : XL_SUCCESS
Set Notification : XL_SUCCESS
Activate Channel : XL_SUCCESS
demoToggleTimerRate, xlSetTimerRate (timerRate:100000) result: XL_SUCCESS
CAN FD mode : ISO
TX Arb. BitRate : 1000000Bd, Data Bitrate: 2000000Bd
Start Rx thread...
Press <ENTER> to transmit CAN messages
<b>, <ENTER> to block Rx thread for rx-overrun-test
<B>, <ENTER> burst of CAN TX messages
<x>, <ENTER> to exit
위 출력 결과의 소스코드와 설정, 실행 환경은 다음과 같습니다.
/*-------------------------------------------------------------------------------------------
| File : Class1.cs
| Project : Vector CAN FD .NET Example
|
| Description : This example demonstrates the basic CAN FD functionality of the XL.NET Driver Library
|--------------------------------------------------------------------------------------------
| Copyright (c) 2019 by Vector Informatik GmbH. All rights reserved.
|-------------------------------------------------------------------------------------------*/
using System;
using System.Runtime.InteropServices;
using System.Threading;
using vxlapi_NET;
namespace xlCANDemo
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
// -----------------------------------------------------------------------------------------------
// DLL Import for RX events
// -----------------------------------------------------------------------------------------------
[DllImport("kernel32.dll", SetLastError = true)]
static extern int WaitForSingleObject(int handle, int timeOut);
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
// Global variables
// -----------------------------------------------------------------------------------------------
// Driver access through XLDriver (wrapper)
private static XLDriver CANDemo = new XLDriver();
private static String appName = "xlCANdemoNET";
// Driver configuration
private static XLClass.xl_driver_config driverConfig = new XLClass.xl_driver_config();
// Variables required by XLDriver
private static XLDefine.XL_HardwareType hwType = XLDefine.XL_HardwareType.XL_HWTYPE_NONE;
private static uint hwIndex = 0;
private static uint hwChannel = 0;
private static int portHandle = -1;
private static int eventHandle = -1;
private static UInt64 accessMask = 0;
private static UInt64 permissionMask = 0;
private static UInt64 txMask = 0;
private static UInt64 rxMask = 0;
private static int txCi = 0;
private static int rxCi = 0;
private static uint canFdModeNoIso = 0; // Global CAN FD ISO (default) / no ISO mode flag
// RX thread
private static Thread rxThread;
private static bool blockRxThread = false;
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
/// <summary>
/// MAIN
///
/// Sends and receives CAN FD messages using main methods of the "XLDriver" class.
/// This demo requires two connected CAN channels (Vector network interface).
/// The configuration is read from Vector Hardware Config (vcanconf.exe).
/// </summary>
// -----------------------------------------------------------------------------------------------
[STAThread]
static int Main(string[] args)
{
XLDefine.XL_Status status;
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine(" xlCANFDdemo.NET C# V11.0 ");
Console.WriteLine("Copyright (c) 2019 by Vector Informatik GmbH. All rights reserved.");
Console.WriteLine("-------------------------------------------------------------------\n");
// print .NET wrapper version
Console.WriteLine("vxlapi_NET : " + typeof(XLDriver).Assembly.GetName().Version);
// Open XL Driver
status = CANDemo.XL_OpenDriver();
Console.WriteLine("Open Driver : " + status);
if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
// Get XL Driver configuration
status = CANDemo.XL_GetDriverConfig(ref driverConfig);
Console.WriteLine("Get Driver Config : " + status);
if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
// Convert the dll version number into a readable string
Console.WriteLine("DLL Version : " + CANDemo.VersionToString(driverConfig.dllVersion));
// Display channel count
Console.WriteLine("Channels found : " + driverConfig.channelCount);
// Display all found channels
for (int i = 0; i < driverConfig.channelCount; i++)
{
Console.WriteLine("\n [{0}] " + driverConfig.channel[i].name, i);
if ((driverConfig.channel[i].channelCapabilities & XLDefine.XL_ChannelCapabilities.XL_CHANNEL_FLAG_CANFD_ISO_SUPPORT) == XLDefine.XL_ChannelCapabilities.XL_CHANNEL_FLAG_CANFD_ISO_SUPPORT)
Console.WriteLine(" - CAN FD Support : yes");
else Console.WriteLine(" - CAN FD Support : no");
Console.WriteLine(" - Name : " + driverConfig.channel[i].name);
Console.WriteLine(" - Transciver Name : " + driverConfig.channel[i].transceiverName);
Console.WriteLine(" - Article Number : " + driverConfig.channel[i].articleNumber);
Console.WriteLine(" - Serial Number : " + driverConfig.channel[i].serialNumber);
Console.WriteLine(" - Interface Version : " + driverConfig.channel[i].interfaceVersion);
Console.WriteLine(" - Driver Version : " + driverConfig.channel[i].driverVersion);
Console.WriteLine(" - isOnBus : " + driverConfig.channel[i].isOnBus);
Console.WriteLine(" - Capabilities : " + driverConfig.channel[i].channelCapabilities);
Console.WriteLine(" - Channel Mask : " + driverConfig.channel[i].channelMask);
Console.WriteLine(" - Channel Index : " + driverConfig.channel[i].channelIndex);
Console.WriteLine(" - Hw Channel : " + driverConfig.channel[i].hwChannel);
Console.WriteLine(" - Hw Index : " + driverConfig.channel[i].hwIndex);
Console.WriteLine(" - Hw Type : " + driverConfig.channel[i].hwType);
}
// If the application name cannot be found in VCANCONF...
if ((CANDemo.XL_GetApplConfig(appName, 0, ref hwType, ref hwIndex, ref hwChannel, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN) != XLDefine.XL_Status.XL_SUCCESS) ||
(CANDemo.XL_GetApplConfig(appName, 1, ref hwType, ref hwIndex, ref hwChannel, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN) != XLDefine.XL_Status.XL_SUCCESS))
{
//...create the item with two CAN channels
CANDemo.XL_SetApplConfig(appName, 0, XLDefine.XL_HardwareType.XL_HWTYPE_NONE, 0, 0, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN);
CANDemo.XL_SetApplConfig(appName, 1, XLDefine.XL_HardwareType.XL_HWTYPE_NONE, 0, 0, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN);
PrintAssignErrorAndPopupHwConf();
}
// Request the user to assign channels until both CAN1 (Tx) and CAN2 (Rx) are assigned to usable channels
while (!GetAppChannelAndTestIsOk(0, ref txMask, ref txCi) || !GetAppChannelAndTestIsOk(1, ref rxMask, ref rxCi))
{
PrintAssignErrorAndPopupHwConf();
}
PrintConfig();
accessMask = txMask | rxMask;
permissionMask = accessMask;
// --------------------
// Open port
// --------------------
status = CANDemo.XL_OpenPort(ref portHandle, appName, accessMask, ref permissionMask, 16000, XLDefine.XL_InterfaceVersion.XL_INTERFACE_VERSION_V4, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN);
Console.WriteLine("\n\nOpen Port : " + status);
if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
// --------------------
// Set CAN FD config
// --------------------
XLClass.XLcanFdConf canFdConf = new XLClass.XLcanFdConf();
// arbitration bitrate
canFdConf.arbitrationBitRate = 1000000;
canFdConf.tseg1Abr = 6;
canFdConf.tseg2Abr = 3;
canFdConf.sjwAbr = 2;
// data bitrate
canFdConf.dataBitRate = canFdConf.arbitrationBitRate * 2;
canFdConf.tseg1Dbr = 6;
canFdConf.tseg2Dbr = 3;
canFdConf.sjwDbr = 2;
if (canFdModeNoIso > 0)
{
canFdConf.options = (byte)XLDefine.XL_CANFD_ConfigOptions.XL_CANFD_CONFOPT_NO_ISO;
}
else
{
canFdConf.options = 0;
}
status = CANDemo.XL_CanFdSetConfiguration(portHandle, accessMask, canFdConf);
Console.WriteLine("\n\nSet CAN FD Config : " + status);
if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
// Get RX event handle
status = CANDemo.XL_SetNotification(portHandle, ref eventHandle, 1);
Console.WriteLine("Set Notification : " + status);
if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
// Activate channel - with reset clock
status = CANDemo.XL_ActivateChannel(portHandle, accessMask, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN, XLDefine.XL_AC_Flags.XL_ACTIVATE_RESET_CLOCK);
Console.WriteLine("Activate Channel : " + status);
if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
uint timer = 100000;
//status = CANDemo.XL_SetTimerRate(portHandle, timer);
//Console.WriteLine("Timer Set : " + status);
//if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
// Get XL Driver configuration to get the actual setup parameter
status = CANDemo.XL_GetDriverConfig(ref driverConfig);
Console.WriteLine("demoToggleTimerRate, xlSetTimerRate (timerRate:{0}) result: {1}", timer, CANDemo.XL_GetErrorString(status));
if (status != XLDefine.XL_Status.XL_SUCCESS) PrintFunctionError();
if (canFdModeNoIso > 0)
{
Console.WriteLine("CAN FD mode : NO ISO");
}
else
{
Console.WriteLine("CAN FD mode : ISO");
}
Console.WriteLine("TX Arb. BitRate : " + driverConfig.channel[txCi].busParams.dataCanFd.arbitrationBitRate
+ "Bd, Data Bitrate: " + driverConfig.channel[txCi].busParams.dataCanFd.dataBitRate + "Bd");
// Run Rx thread
Console.WriteLine("Start Rx thread...");
rxThread = new Thread(new ThreadStart(RXThread));
rxThread.Start();
// User information
Console.WriteLine("Press <ENTER> to transmit CAN messages \n <b>, <ENTER> to block Rx thread for rx-overrun-test \n <B>, <ENTER> burst of CAN TX messages \n <x>, <ENTER> to exit");
// Transmit CAN data
while (true)
{
if (blockRxThread)Console.WriteLine("Rx thread blocked.");
// Read user input
string str = Console.ReadLine();
if (str == "b")blockRxThread = !blockRxThread;
else if (str == "B")
{
for (int i = 0; i < 1000; i++)
{
// Burst of CAN frames
CANFDTransmitDemo();
}
}
else if (str == "x") break;
else
{
// Send CAN frames
CANFDTransmitDemo();
}
}
// Kill Rx thread
rxThread.Abort();
Console.WriteLine("Close Port : " + CANDemo.XL_ClosePort(portHandle));
Console.WriteLine("Close Driver : " + CANDemo.XL_CloseDriver());
return 0;
}
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
/// <summary>
/// Error message/exit in case of a functional call does not return XL_SUCCESS
/// </summary>
// -----------------------------------------------------------------------------------------------
private static int PrintFunctionError()
{
Console.WriteLine("\nERROR: Function call failed!\nPress any key to continue...");
Console.ReadKey();
return -1;
}
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
/// <summary>
/// Displays the Vector Hardware Configuration.
/// </summary>
// -----------------------------------------------------------------------------------------------
private static void PrintConfig()
{
Console.WriteLine("\n\nAPPLICATION CONFIGURATION");
foreach (int channelIndex in new int[] { txCi, rxCi })
{
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine("Configured Hardware Channel : " + driverConfig.channel[channelIndex].name);
Console.WriteLine("Hardware Driver Version : " + CANDemo.VersionToString(driverConfig.channel[channelIndex].driverVersion));
Console.WriteLine("Used Transceiver : " + driverConfig.channel[channelIndex].transceiverName);
}
Console.WriteLine("-------------------------------------------------------------------\n");
}
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
/// <summary>
/// Error message if channel assignment is not valid.
/// </summary>
// -----------------------------------------------------------------------------------------------
private static void PrintAssignErrorAndPopupHwConf()
{
Console.WriteLine("\nPlease check application settings of \"" + appName + " CAN1/CAN2\",\nassign it to available hardware channels and press enter.");
CANDemo.XL_PopupHwConfig();
Console.ReadKey();
}
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
/// <summary>
/// Retrieve the application channel assignment and test if this channel can be opened
/// </summary>
// -----------------------------------------------------------------------------------------------
private static bool GetAppChannelAndTestIsOk(uint appChIdx, ref UInt64 chMask, ref int chIdx)
{
XLDefine.XL_Status status = CANDemo.XL_GetApplConfig(appName, appChIdx, ref hwType, ref hwIndex, ref hwChannel, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN);
if (status != XLDefine.XL_Status.XL_SUCCESS)
{
Console.WriteLine("XL_GetApplConfig : " + status);
PrintFunctionError();
}
chMask = CANDemo.XL_GetChannelMask(hwType, (int)hwIndex, (int)hwChannel);
chIdx = CANDemo.XL_GetChannelIndex(hwType, (int)hwIndex, (int)hwChannel);
if (chIdx < 0 || chIdx >= driverConfig.channelCount)
{
// the (hwType, hwIndex, hwChannel) triplet stored in the application configuration does not refer to any available channel.
return false;
}
if ((driverConfig.channel[chIdx].channelBusCapabilities & XLDefine.XL_BusCapabilities.XL_BUS_ACTIVE_CAP_CAN) == 0)
{
// CAN is not available on this channel
return false;
}
if (canFdModeNoIso > 0)
{
if ((driverConfig.channel[chIdx].channelCapabilities & XLDefine.XL_ChannelCapabilities.XL_CHANNEL_FLAG_CANFD_BOSCH_SUPPORT) == 0)
{
Console.WriteLine("{0} ({1}) does not support CAN FD NO-ISO", driverConfig.channel[chIdx].name.TrimEnd(' ', '\0'),
driverConfig.channel[chIdx].transceiverName.TrimEnd(' ', '\0'));
return false;
}
}
else
{
if ((driverConfig.channel[chIdx].channelCapabilities & XLDefine.XL_ChannelCapabilities.XL_CHANNEL_FLAG_CANFD_ISO_SUPPORT) == 0)
{
Console.WriteLine("{0} ({1}) does not support CAN FD ISO", driverConfig.channel[chIdx].name.TrimEnd(' ', '\0'),
driverConfig.channel[chIdx].transceiverName.TrimEnd(' ', '\0'));
return false;
}
}
return true;
}
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
/// <summary>
/// Sends some CAN messages.
/// </summary>
// -----------------------------------------------------------------------------------------------
public static void CANFDTransmitDemo()
{
XLDefine.XL_Status txStatus;
// Create an event collection with 2 messages (events)
XLClass.xl_canfd_event_collection xlEventCollection = new XLClass.xl_canfd_event_collection(1);
// event 1
xlEventCollection.xlCANFDEvent[0].tag = XLDefine.XL_CANFD_TX_EventTags.XL_CAN_EV_TAG_TX_MSG;
xlEventCollection.xlCANFDEvent[0].tagData.canId = 0x100;
xlEventCollection.xlCANFDEvent[0].tagData.dlc = XLDefine.XL_CANFD_DLC.DLC_CAN_CANFD_8_BYTES;
xlEventCollection.xlCANFDEvent[0].tagData.msgFlags = XLDefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_BRS | XLDefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_EDL;
xlEventCollection.xlCANFDEvent[0].tagData.data[0] = 1;
xlEventCollection.xlCANFDEvent[0].tagData.data[1] = 1;
xlEventCollection.xlCANFDEvent[0].tagData.data[2] = 2;
xlEventCollection.xlCANFDEvent[0].tagData.data[3] = 2;
xlEventCollection.xlCANFDEvent[0].tagData.data[4] = 3;
xlEventCollection.xlCANFDEvent[0].tagData.data[5] = 3;
xlEventCollection.xlCANFDEvent[0].tagData.data[6] = 4;
xlEventCollection.xlCANFDEvent[0].tagData.data[7] = 4;
//// event 2
//xlEventCollection.xlCANFDEvent[1].tag = XLDefine.XL_CANFD_TX_EventTags.XL_CAN_EV_TAG_TX_MSG;
//xlEventCollection.xlCANFDEvent[1].tagData.canId = 0x200;
//xlEventCollection.xlCANFDEvent[1].tagData.dlc = XLDefine.XL_CANFD_DLC.DLC_CANFD_64_BYTES;
//xlEventCollection.xlCANFDEvent[1].tagData.msgFlags = XLDefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_BRS | XLDefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_EDL;
//xlEventCollection.xlCANFDEvent[1].tagData.data[0] = 7;
//xlEventCollection.xlCANFDEvent[1].tagData.data[1] = 7;
//xlEventCollection.xlCANFDEvent[1].tagData.data[2] = 8;
//xlEventCollection.xlCANFDEvent[1].tagData.data[3] = 8;
//xlEventCollection.xlCANFDEvent[1].tagData.data[4] = 9;
//xlEventCollection.xlCANFDEvent[1].tagData.data[5] = 9;
//xlEventCollection.xlCANFDEvent[1].tagData.data[6] = 3;
//xlEventCollection.xlCANFDEvent[1].tagData.data[7] = 2;
//xlEventCollection.xlCANFDEvent[1].tagData.data[8] = 1;
//xlEventCollection.xlCANFDEvent[1].tagData.data[63] = 9;
for (int i = 0; i < 10; i++)
{
// Transmit events
uint messageCounterSent = 0;
txStatus = CANDemo.XL_CanTransmitEx(portHandle, txMask, ref messageCounterSent, xlEventCollection);
Console.WriteLine("Transmit Message ({0}) : " + txStatus, messageCounterSent);
}
}
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------
/// <summary>
/// EVENT THREAD (RX)
///
/// RX thread waits for Vector interface events and displays filtered CAN messages.
/// </summary>
// -----------------------------------------------------------------------------------------------
public static void RXThread()
{
// Create new object containing received data
XLClass.XLcanRxEvent receivedEvent = new XLClass.XLcanRxEvent();
// Result of XL Driver function calls
XLDefine.XL_Status xlStatus = XLDefine.XL_Status.XL_SUCCESS;
// Result values of WaitForSingleObject
XLDefine.WaitResults waitResult = new XLDefine.WaitResults();
// Note: this thread will be destroyed by MAIN
while (true)
{
// Wait for hardware events
waitResult = (XLDefine.WaitResults)WaitForSingleObject(eventHandle, 1000);
// If event occurred...
if (waitResult != XLDefine.WaitResults.WAIT_TIMEOUT)
{
// ...init xlStatus first
xlStatus = XLDefine.XL_Status.XL_SUCCESS;
// afterwards: while hw queue is not empty...
while (xlStatus != XLDefine.XL_Status.XL_ERR_QUEUE_IS_EMPTY)
{
// ...block RX thread to generate RX-Queue overflows
while (blockRxThread) Thread.Sleep(1000);
// ...receive data from hardware.
xlStatus = CANDemo.XL_CanReceive(portHandle, ref receivedEvent);
// If receiving succeed....
if (xlStatus == XLDefine.XL_Status.XL_SUCCESS)
{
Console.WriteLine(CANDemo.XL_CanGetEventString(receivedEvent));
}
}
}
// No event occurred
}
}
// -----------------------------------------------------------------------------------------------
}
}
두 기기는 각각 채널2에 연결된 모습을 볼 수 있습니다.