This example only works with custom usb hardware. Using this example on a usb device it was not designed for could be catastrophic!
To meet the requirements, your usb hardware must implement loopback functionality in Config 1, Interface 0, Endpoints 0x01 and 0x81.
Read Write (Polling): Console Application Description
Opens a USB device by vendor and product id.
Opens a UsbEndpointReader class for reading.
Opens a UsbEndpointWriter class for writing.
Writes all command line text to Ep01
Reads and displays usb device output from Ep01
Example
CopyC#
using System; using System.Text; using System.Text.RegularExpressions; using LibUsbDotNet; using LibUsbDotNet.Main; namespace Examples { internal class ReadWrite { public static UsbDevice MyUsbDevice; #region SET YOUR USB Vendor and Product ID! public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(1234, 1); #endregion public static void Main(string[] args) { ErrorCode ec = ErrorCode.None; try { // Find and open the usb device. MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder); // If the device is open and ready if (MyUsbDevice == null) throw new Exception("Device Not Found."); // If this is a "whole" usb device (libusb-win32, linux libusb) // it will have an IUsbDevice interface. If not (WinUSB) the // variable will be null indicating this is an interface of a // device. IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice; if (!ReferenceEquals(wholeUsbDevice, null)) { // This is a "whole" USB device. Before it can be used, // the desired configuration and interface must be selected. // Select config #1 wholeUsbDevice.SetConfiguration(1); // Claim interface #0. wholeUsbDevice.ClaimInterface(0); } // open read endpoint 1. UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01); // open write endpoint 1. UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01); // Remove the exepath/startup filename text from the begining of the CommandLine. string cmdLine = Regex.Replace( Environment.CommandLine, "^\".+?\"^.*? |^.*? ", "", RegexOptions.Singleline); if (!String.IsNullOrEmpty(cmdLine)) { int bytesWritten; ec = writer.Write(Encoding.Default.GetBytes(cmdLine), 2000, out bytesWritten); if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString); byte[] readBuffer = new byte[1024]; while (ec == ErrorCode.None) { int bytesRead; // If the device hasn't sent data in the last 100 milliseconds, // a timeout error (ec = IoTimedOut) will occur. ec = reader.Read(readBuffer, 100, out bytesRead); if (bytesRead == 0) throw new Exception("No more bytes!"); // Write that output to the console. Console.Write(Encoding.Default.GetString(readBuffer, 0, bytesRead)); } Console.WriteLine("\r\nDone!\r\n"); } else throw new Exception("Nothing to do."); } catch (Exception ex) { Console.WriteLine(); Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message); } finally { if (MyUsbDevice != null) { if (MyUsbDevice.IsOpen) { // If this is a "whole" usb device (libusb-win32, linux libusb-1.0) // it exposes an IUsbDevice interface. If not (WinUSB) the // 'wholeUsbDevice' variable will be null indicating this is // an interface of a device; it does not require or support // configuration and interface selection. IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice; if (!ReferenceEquals(wholeUsbDevice, null)) { // Release interface #0. wholeUsbDevice.ReleaseInterface(0); } MyUsbDevice.Close(); } MyUsbDevice = null; // Free usb resources UsbDevice.Exit(); } // Wait for user input.. Console.ReadKey(); } } } }
Example
CopyVB.NET
Imports System Imports System.Text Imports System.Text.RegularExpressions Imports LibUsbDotNet Imports LibUsbDotNet.Main Namespace Examples Friend Class ReadWrite Public Shared MyUsbDevice As UsbDevice #Region "SET YOUR USB Vendor and Product ID!" Public Shared MyUsbFinder As New UsbDeviceFinder(1234, 1) #End Region Public Shared Sub Main(args As String()) Dim ec As ErrorCode = ErrorCode.None Try ' Find and open the usb device. MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder) ' If the device is open and ready If MyUsbDevice Is Nothing Then Throw New Exception("Device Not Found.") End If ' If this is a "whole" usb device (libusb-win32, linux libusb) ' it will have an IUsbDevice interface. If not (WinUSB) the ' variable will be null indicating this is an interface of a ' device. Dim wholeUsbDevice As IUsbDevice = TryCast(MyUsbDevice, IUsbDevice) If Not ReferenceEquals(wholeUsbDevice, Nothing) Then ' This is a "whole" USB device. Before it can be used, ' the desired configuration and interface must be selected. ' Select config #1 wholeUsbDevice.SetConfiguration(1) ' Claim interface #0. wholeUsbDevice.ClaimInterface(0) End If ' open read endpoint 1. Dim reader As UsbEndpointReader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01) ' open write endpoint 1. Dim writer As UsbEndpointWriter = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01) ' Remove the exepath/startup filename text from the begining of the CommandLine. Dim cmdLine As String = Regex.Replace(Environment.CommandLine, "^"".+?""^.*? |^.*? ", "", RegexOptions.Singleline) If Not [String].IsNullOrEmpty(cmdLine) Then Dim bytesWritten As Integer ec = writer.Write(Encoding.[Default].GetBytes(cmdLine), 2000, bytesWritten) If ec <> ErrorCode.None Then Throw New Exception(UsbDevice.LastErrorString) End If Dim readBuffer As Byte() = New Byte(1023) {} While ec = ErrorCode.None Dim bytesRead As Integer ' If the device hasn't sent data in the last 100 milliseconds, ' a timeout error (ec = IoTimedOut) will occur. ec = reader.Read(readBuffer, 100, bytesRead) If bytesRead = 0 Then Throw New Exception("No more bytes!") End If ' Write that output to the console. Console.Write(Encoding.[Default].GetString(readBuffer, 0, bytesRead)) End While Console.WriteLine(vbCr & vbLf & "Done!" & vbCr & vbLf) Else Throw New Exception("Nothing to do.") End If Catch ex As Exception Console.WriteLine() Console.WriteLine((If(ec <> ErrorCode.None, ec & ":", [String].Empty)) & ex.Message) Finally If MyUsbDevice IsNot Nothing Then If MyUsbDevice.IsOpen Then ' If this is a "whole" usb device (libusb-win32, linux libusb-1.0) ' it exposes an IUsbDevice interface. If not (WinUSB) the ' 'wholeUsbDevice' variable will be null indicating this is ' an interface of a device; it does not require or support ' configuration and interface selection. Dim wholeUsbDevice As IUsbDevice = TryCast(MyUsbDevice, IUsbDevice) If Not ReferenceEquals(wholeUsbDevice, Nothing) Then ' Release interface #0. wholeUsbDevice.ReleaseInterface(0) End If MyUsbDevice.Close() End If MyUsbDevice = Nothing ' Free usb resources UsbDevice.[Exit]() End If ' Wait for user input.. Console.ReadKey() End Try End Sub End Class End Namespace
Compiling the Code
Create a new console application in your favorite designer.
Verify your project references:
System.dll
LibUsbDotNet.dll
Add/edit the main class. Copy/Paste code from one of the examples above.
Note:
Example usb device firmware is located in the [InstallDirectory]\Benchmark\Firmware\[Manufacturer] directory.