Read Write (Event Driven)

LibUsbDotNet

LibUsbDotNet 2.2.8 Read Write (Event Driven)
LibUsbDotNet on SourceForge

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 (Event Driven): Console Application Description
  1. Opens a USB device by vendor and product id.

  2. Sets DataReceivedEnabled=True.

  3. Hooks DataReceived event.

  4. Writes all command line text to Ep01

  5. Dumps received data to the console window.

Example
CopyC#
using System;
using System.Text;
using System.Text.RegularExpressions;
using LibUsbDotNet;
using LibUsbDotNet.Main;

namespace Examples
{
    internal class ReadWriteEventDriven
    {
        public static DateTime LastDataEventDate = DateTime.Now;
        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-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))
                {
                    // 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))
                {
                    reader.DataReceived += (OnRxEndPointData);
                    reader.DataReceivedEnabled = true;

                    int bytesWritten;
                    ec = writer.Write(Encoding.Default.GetBytes(cmdLine), 2000, out bytesWritten);
                    if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString);

                    LastDataEventDate = DateTime.Now;
                    while ((DateTime.Now - LastDataEventDate).TotalMilliseconds < 100)
                    {
                    }

                    // Always disable and unhook event when done.
                    reader.DataReceivedEnabled = false;
                    reader.DataReceived -= (OnRxEndPointData);

                    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();
            }
        }

        private static void OnRxEndPointData(object sender, EndpointDataEventArgs e)
        {
            LastDataEventDate = DateTime.Now;
            Console.Write(Encoding.Default.GetString(e.Buffer, 0, e.Count));
        }
    }
}
Example
CopyVB.NET
Imports System
Imports System.Text
Imports System.Text.RegularExpressions
Imports LibUsbDotNet
Imports LibUsbDotNet.Main

Namespace Examples
    Friend Class ReadWriteEventDriven
        Public Shared LastDataEventDate As DateTime = DateTime.Now
        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-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
                    ' 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
                    reader.DataReceived += (AddressOf OnRxEndPointData)
                    reader.DataReceivedEnabled = True

                    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

                    LastDataEventDate = DateTime.Now
                    While (DateTime.Now - LastDataEventDate).TotalMilliseconds < 100
                    End While

                    ' Always disable and unhook event when done.
                    reader.DataReceivedEnabled = False
                    reader.DataReceived -= (AddressOf OnRxEndPointData)

                    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
                End If
                MyUsbDevice = Nothing

                ' Free usb resources
                UsbDevice.[Exit]()

                ' Wait for user input..
                Console.ReadKey()
            End Try
        End Sub

        Private Shared Sub OnRxEndPointData(sender As Object, e As EndpointDataEventArgs)
            LastDataEventDate = DateTime.Now
            Console.Write(Encoding.[Default].GetString(e.Buffer, 0, e.Count))
        End Sub
    End Class
End Namespace
Compiling the Code
  1. Create a new console application in your favorite designer.

  2. Verify your project references:

    • System.dll

    • LibUsbDotNet.dll

  3. 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.