public void RXThread() { XLClass.XLcanRxEvent receivedEvent = new XLClass.XLcanRxEvent(); XLDefine.XL_Status xlStatus = XLDefine.XL_Status.XL_SUCCESS; XLDefine.WaitResults waitResult = new XLDefine.WaitResults(); while (true) { 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 = CANDriver.XL_CanReceive(portHandle, ref receivedEvent); // If receiving succeed.... if (xlStatus == XLDefine.XL_Status.XL_SUCCESS) { rawRxString = CANDriver.XL_CanGetEventString(receivedEvent); } } } // No event occurred } }
public void CanTp_ReceptionInd() { // 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; // Result values of WaitForSingleObject XLDefine.WaitResults waitResult = new XLDefine.WaitResults(); byte diagFrameType; byte[] diagPDU = new byte[1024]; int diagPDULength = 0, diagPDUoffset = 0; byte diagSequenceNum = 0; byte diagFlowState; // Note: this thread will be destroyed by MAIN while (true) { // Wait for hardware events waitResult = (XLDefine.WaitResults)WaitForSingleObject(eventHandle, 1000); if (waitFrameType == 0) { continue; } // 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 = CANTPDriver.XL_Receive(portHandle, ref receivedEvent); // If receiving succeed.... if (xlStatus == XLDefine.XL_Status.XL_SUCCESS) { Console.WriteLine(receivedEvent.tagData.can_Msg.id); if ((receivedEvent.flags & XLDefine.XL_MessageFlags.XL_EVENT_FLAG_OVERRUN) != 0) { Console.WriteLine("-- XL_EVENT_FLAG_OVERRUN --"); } // ...and data is a Rx msg... if (receivedEvent.tag == XLDefine.XL_EventTags.XL_RECEIVE_MSG) { if (receivedEvent.tagData.can_Msg.id == this.RxID) { Console.WriteLine(CANTPDriver.XL_GetEventString(receivedEvent)); diagFrameType = (byte)(receivedEvent.tagData.can_Msg.data[0] >> 4); switch (diagFrameType) { //Single Frame case 0: if (waitFrameType == 1) { diagPDULength = receivedEvent.tagData.can_Msg.data[0] & 0x0F; for (int i = 0; i < diagPDULength; i++) { diagPDU[i] = receivedEvent.tagData.can_Msg.data[i + 1]; } OnDiagPduReceived(diagPDU, diagPDULength); Console.WriteLine("PDU Length:" + diagPDULength); } break; //FirstFrame case 1: if (waitFrameType == 1) { diagPDULength = (receivedEvent.tagData.can_Msg.data[0] & 0x0F) * 256 + (receivedEvent.tagData.can_Msg.data[1]); for (int i = 0; i < 6; i++) { diagPDU[i] = receivedEvent.tagData.can_Msg.data[i + 2]; } diagPDUoffset = 6; diagSequenceNum = 0; CanTpSendFlowControlFrame(); waitFrameType = 2; Console.WriteLine("PDU Length:" + diagPDULength); } break; //ConsecutiveFrame case 2: if (waitFrameType == 2) { if (diagSequenceNum + 1 == (byte)(receivedEvent.tagData.can_Msg.data[0] & 0x0F)) { diagSequenceNum = (byte)(receivedEvent.tagData.can_Msg.data[0] & 0x0F); for (int i = diagPDUoffset; i < diagPDUoffset + 7; i++) { diagPDU[i] = receivedEvent.tagData.can_Msg.data[i + 1]; } if (diagPDUoffset == diagPDULength) { OnDiagPduReceived(diagPDU, diagPDULength); } } } break; //FlowControl case 3: if (waitFrameType == 3) { diagFlowState = (byte)(receivedEvent.tagData.can_Msg.data[0] & 0x0F); this.TxdiagBlockSize = receivedEvent.tagData.can_Msg.data[1]; this.TxdiagSTmin = receivedEvent.tagData.can_Msg.data[2]; waitforFlowControlEvent.Set(); } break; } } //if ((receivedEvent.tagData.can_Msg.flags & XLDefine.XL_MessageFlags.XL_CAN_MSG_FLAG_OVERRUN) != 0) //{ // Console.WriteLine("-- XL_CAN_MSG_FLAG_OVERRUN --"); //} //// ...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) //{ // Console.WriteLine("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) //{ // Console.WriteLine("REMOTE FRAME"); //} //else //{ // Console.WriteLine(CANTPDriver.XL_GetEventString(receivedEvent)); //} } } } } // No event occurred } }
public string Receive() { string dataFromDriver = ""; for (int i = 0; i < 8; i++) { ReceivedData[i] = 0; } XLClass.xl_event receivedEvent = new XLClass.xl_event(); XLDefine.XL_Status xlStatus = XLDefine.XL_Status.XL_SUCCESS; XLDefine.WaitResults waitResult = (XLDefine.WaitResults)WaitForSingleObject(eventHandle, 1000); if (waitResult != XLDefine.WaitResults.WAIT_TIMEOUT) { dataFromDriver += $"[{DateTime.Now.Hour:D2} : {DateTime.Now.Minute:D2} : {DateTime.Now.Second:D2} : {DateTime.Now.Millisecond:D3}] "; while (xlStatus != XLDefine.XL_Status.XL_ERR_QUEUE_IS_EMPTY) { xlStatus = driver.XL_Receive(portHandle, ref receivedEvent); switch (receivedEvent.tag) { case XLDefine.XL_EventTags.XL_LIN_MSG: string dir = "RX".PadRight(3); if ((receivedEvent.tagData.linMsgApi.linMsg.flags & XLDefine.XL_MessageFlags.XL_LIN_MSGFLAG_TX) == XLDefine.XL_MessageFlags.XL_LIN_MSGFLAG_TX) { dir = "TX".PadRight(3); } else { for (int i = 0; i < 8; i++) { ReceivedData[i] = receivedEvent.tagData.linMsgApi.linMsg.data[i]; } } dataFromDriver += ("XL_LIN_MSG, " + dir + " id: " + receivedEvent.tagData.linMsgApi.linMsg.id.ToString("X2").PadRight(3) + ", data: " + receivedEvent.tagData.linMsgApi.linMsg.data[0].ToString("X2") + " " + receivedEvent.tagData.linMsgApi.linMsg.data[1].ToString("X2") + " " + receivedEvent.tagData.linMsgApi.linMsg.data[2].ToString("X2") + " " + receivedEvent.tagData.linMsgApi.linMsg.data[3].ToString("X2") + " " + receivedEvent.tagData.linMsgApi.linMsg.data[4].ToString("X2") + " " + receivedEvent.tagData.linMsgApi.linMsg.data[5].ToString("X2") + " " + receivedEvent.tagData.linMsgApi.linMsg.data[6].ToString("X2") + " " + receivedEvent.tagData.linMsgApi.linMsg.data[7].ToString("X2")) + " (cha-1) " + receivedEvent.chanIndex.ToString(); break; case XLDefine.XL_EventTags.XL_LIN_ERRMSG: dataFromDriver += ("XL_LIN_ERRMSG"); break; case XLDefine.XL_EventTags.XL_LIN_SYNCERR: dataFromDriver += ("XL_LIN_SYNCERR"); break; case XLDefine.XL_EventTags.XL_LIN_NOANS: dataFromDriver += ("XL_LIN_NOANS") + " (cha-1) " + receivedEvent.chanIndex.ToString(); break; case XLDefine.XL_EventTags.XL_LIN_WAKEUP: dataFromDriver += ("XL_LIN_WAKEUP"); break; case XLDefine.XL_EventTags.XL_LIN_SLEEP: dataFromDriver += ("XL_LIN_SLEEP"); break; case XLDefine.XL_EventTags.XL_LIN_CRCINFO: dataFromDriver += ("XL_LIN_CRCINFO"); break; } } } else { dataFromDriver += "Timeout"; } //Trace.WriteLine(dataFromDriver); driver.XL_FlushReceiveQueue(portHandle); return(dataFromDriver); }
// ----------------------------------------------------------------------------------------------- /// <summary> /// EVENT THREAD (RX) /// /// RX thread waits for Vector interface events and displays filtered CAN messages. /// </summary> // ----------------------------------------------------------------------------------------------- public 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; // 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_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) { Console.WriteLine("-- XL_EVENT_FLAG_OVERRUN --"); } // ...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) { Console.WriteLine("-- XL_CAN_MSG_FLAG_OVERRUN --"); } // ...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) { Console.WriteLine("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) { Console.WriteLine("REMOTE FRAME"); } else { Console.WriteLine(CANDemo.XL_GetEventString(receivedEvent)); } } } } } // No event occurred } }