private static void ReadData(object context) { UsbTransfer overlappedTransferContext = (UsbTransfer)context; UsbEndpointReader reader = (UsbEndpointReader)overlappedTransferContext.EndpointBase; reader.mDataReceivedEnabled = true; EventHandler <DataReceivedEnabledChangedEventArgs> dataReceivedEnabledChangedEvent; dataReceivedEnabledChangedEvent = reader.DataReceivedEnabledChanged; if (!ReferenceEquals(dataReceivedEnabledChangedEvent, null)) { dataReceivedEnabledChangedEvent(reader, new DataReceivedEnabledChangedEventArgs(reader.mDataReceivedEnabled)); } overlappedTransferContext.Reset(); byte[] buf = new byte[reader.mReadBufferSize]; try { while (!overlappedTransferContext.IsCancelled) { int iTransferLength; ErrorCode eReturn = reader.Transfer(buf, 0, buf.Length, Timeout.Infinite, out iTransferLength); if (eReturn == ErrorCode.None) { EventHandler <EndpointDataEventArgs> temp = reader.DataReceived; if (!ReferenceEquals(temp, null) && !overlappedTransferContext.IsCancelled) { temp(reader, new EndpointDataEventArgs(buf, iTransferLength)); } continue; } if (eReturn != ErrorCode.IoTimedOut) { break; } } } catch (ThreadAbortException) { UsbError.Error(ErrorCode.ReceiveThreadTerminated, 0, "ReadData:Read thread aborted.", reader); } finally { reader.Abort(); reader.mDataReceivedEnabled = false; dataReceivedEnabledChangedEvent = reader.DataReceivedEnabledChanged; if (!ReferenceEquals(dataReceivedEnabledChangedEvent, null)) { dataReceivedEnabledChangedEvent(reader, new DataReceivedEnabledChangedEventArgs(reader.mDataReceivedEnabled)); } } }
/// <summary> /// Opens an endpoint for reading /// </summary> /// <param name="readEndpointID">Endpoint number for read operations.</param> /// <param name="readBufferSize">Size of the read buffer allocated for the <see cref="UsbEndpointReader.DataReceived"/> event.</param> /// <param name="endpointType">The type of endpoint to open.</param> /// <returns>A <see cref="UsbEndpointReader"/> class ready for reading. If the specified endpoint is already been opened, the original <see cref="UsbEndpointReader"/> class is returned.</returns> public virtual UsbEndpointReader OpenEndpointReader(ReadEndpointID readEndpointID, int readBufferSize, EndpointType endpointType) { foreach (UsbEndpointBase activeEndpoint in mActiveEndpoints) { if (activeEndpoint.EpNum == (byte)readEndpointID) { return((UsbEndpointReader)activeEndpoint); } } UsbEndpointReader epNew = new UsbEndpointReader(this, readBufferSize, readEndpointID, endpointType); return((UsbEndpointReader)mActiveEndpoints.Add(epNew)); }