如何在c#上通过xml -driver库实现UDS协议发送诊断信息



我是xml -driver库新手

无法在xml -driver库中找到任何示例代码

有谁知道如何通过xml -driver库在c#上发送uds ?

已经检查了xml -driver库文档。

xml驱动程序库允许您访问不同的总线系统(CAN/LIN/MOST/…-对应Data-Link-Layer)。但是,它不会直接为您处理UDS;你需要自己使用XL驱动库实现传输层(即ISOTP)和应用层(即UDS)的逻辑。这包括:

  • 分割/Desegmentation
  • 发送/接收流量控制
  • 分配UDS负载(即0x22 F1 90)
  • 解释UDS有效负载(即0x62 F1 90 61 62 63 64…)

初始化CAN通道的简单示例如下:

static int Main(string[] args) {
XLDefine.XL_Status status = xlDriver.XL_OpenDriver();
status = xlDriver.XL_GetDriverConfig(ref driverConfig);
// If the application name cannot be found in VCANCONF...
if ((xlDriver.XL_GetApplConfig(appName, 0, ref hwType, ref hwIndex, ref hwChannel, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN) != XLDefine.XL_Status.XL_SUCCESS) ||
(xlDriver.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
xlDriver.XL_SetApplConfig(appName, 0, XLDefine.XL_HardwareType.XL_HWTYPE_NONE, 0, 0, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN);
xlDriver.XL_SetApplConfig(appName, 1, XLDefine.XL_HardwareType.XL_HWTYPE_NONE, 0, 0, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN);
xlDriver.XL_PopupHwConfig();
}
// 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)) {
xlDriver.XL_PopupHwConfig();
}
UInt64 accessMask = txMask | rxMask;
UInt64 permissionMask = accessMask;
status = xlDriver.XL_OpenPort(ref portHandle, appName, accessMask, ref permissionMask, 1024, XLDefine.XL_InterfaceVersion.XL_INTERFACE_VERSION, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN);
status = xlDriver.XL_CanRequestChipState(portHandle, accessMask);
status = xlDriver.XL_ActivateChannel(portHandle, accessMask, XLDefine.XL_BusTypes.XL_BUS_TYPE_CAN, XLDefine.XL_AC_Flags.XL_ACTIVATE_NONE);
int tempInt = -1;
status = xlDriver.XL_SetNotification(portHandle, ref tempInt, 1);
xlEvWaitHandle.SafeWaitHandle = new SafeWaitHandle(new IntPtr(tempInt), true);
status = xlDriver.XL_ResetClock(portHandle);
Thread rxThread = new Thread(new ThreadStart(RXThread));
rxThread.Start();
while (true) {
string str = Console.ReadLine();
// extend here to transmit Messages
}
rxThread.Abort();
return 0;
}

RxThread可以这样定义:

public static void RXThread() {
// Create new object containing received data 
XLClass.xl_event receivedEvent = new XLClass.xl_event();
// Result of XL Driver function calls
XLDefine.XL_Status xlStatus = XLDefine.XL_Status.XL_SUCCESS; 
// Note: this thread will be destroyed by MAIN
while (true) {
// Wait for hardware events
if (xlEvWaitHandle.WaitOne(1000)) {
// ...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 = xlDriver.XL_Receive(portHandle, ref receivedEvent);
//  If receiving succeed....
if (xlStatus == XLDefine.XL_Status.XL_SUCCESS) {
if ((receivedEvent.flags & XLDefine.XL_MessageFlags.XL_EVENT_FLAG_OVERRUN) != 0) {
}
// ...and data is a Rx msg...
if (receivedEvent.tag == XLDefine.XL_EventTags.XL_RECEIVE_MSG) {
if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_OVERRUN) != 0) {
}
// ...check various flags
if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_ERROR_FRAME)
== XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_ERROR_FRAME) {
} else if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_REMOTE_FRAME)
== XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_REMOTE_FRAME) {
}
else {
}
}
}
}
}
// No event occurred
}
}

XL驱动程序库包含许多c#示例,以便在C:UsersPublicDocumentsVectorXL Driver Library xx.xx.xxsamplesNET目录中入门。如果你想使用UDS-on-CAN,即xlCANdemo_Csharp

如果你想直接使用UDS,你需要使用其他API,如SAE J2534或D-PDU API,如果使用这种协议的通道,它们可以抽象传输协议处理。

最新更新