none
USB Device 溝通方法 (LibUsbDotNet library) RRS feed

  • 問題

  • Hi, 各位好

    想請教LibUsbDotNet用法, 目前照著sample code只成功找到device, 但在R/W一直有問題, 

    以下是從sample改的程式碼:

            public static UsbDevice MyUsbDevice;
            public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x0416, 0x3101);
    
           //--------------------------------------------------------------------
                ErrorCode ec = ErrorCode.None;
                try
                {
                    MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
    
                    if (MyUsbDevice == null) throw new Exception("Device Not Found.");
    
                    IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                    if (!ReferenceEquals(wholeUsbDevice, null))
                    {
                        wholeUsbDevice.SetConfiguration(1);
                        wholeUsbDevice.ClaimInterface(0);
                    }
                    UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
                    UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);
    
                    var buffer = new byte[64];
                    buffer[0] = 0x01;
                    buffer[1] = 0x01;
                    buffer[2] = 0x53;
                    buffer[3] = 0x01;
                    buffer[4] = 0xE8;
                    buffer[5] = 0x03;
                    buffer[6] = 0x08;
                    buffer[7] = 0x03;
                    buffer[8] = 0x11;
                    buffer[9] = 0x12;
                    buffer[10] = 0x13;
                    buffer[11] = 0x08;
                    buffer[12] = 0x01;
                    buffer[13] = 0x12;
                    buffer[14] = 0x50;
    
                    int bytesWritten;
                    ec = writer.Write(buffer, 2000, out bytesWritten);
                    if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString);
    
                    var readBuffer = new byte[64];
                    ec = reader.Read(readBuffer, 3000, out var readBytes);
    
                    Console.WriteLine("\r\nDone!\r\n" + readBuffer[0]);
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message);
                }
                finally
                {
                    if (MyUsbDevice != null)
                    {
                        if (MyUsbDevice.IsOpen)
                        {
                            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                            if (!ReferenceEquals(wholeUsbDevice, null))
                            {
                                wholeUsbDevice.ReleaseInterface(0);
                            }
                            MyUsbDevice.Close();
                        }
                    }
                    MyUsbDevice = null;
    
                    UsbDevice.Exit();
                }

    在這行就跳出例外:

    ec = writer.Write(buffer, 2000, out bytesWritten);

    錯誤訊息:

    Exception thrown: 'System.Exception' in LibUSBDotNet.exe
    Win32Error:Win32Error:GetOverlappedResult Ep 0x01 
    87:

    還請前輩指教~ 或是有其他方法與USB Device溝通?

    Thanks



    • 已編輯 _Wayne56 2019年3月12日 上午 09:50
    2019年3月12日 上午 08:54

解答

  • 還有一個錯誤是

    var buffer = new byte[64];

    要寫成

    byte [] buffer = new byte[64];

    ...

    • 已標示為解答 _Wayne56 2019年3月15日 上午 08:43
    2019年3月14日 上午 01:47

所有回覆

  • UsbDevice.LastErrorString的內容是什麼?
    2019年3月13日 上午 12:52
  • UsbDevice.LastErrorString的內容是什麼?

    HI, tihs

    錯誤訊息就是上述的

    Win32Error:Win32Error:GetOverlappedResult Ep 0x01 


    後來使用LibUsbDotNet提供的程式列出USB資訊發現EndpointID , 如圖:

    於是把程式碼改成:

    UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep04);
    //ReadEndpointID.Ep04 = 132 = 0x84
    
    UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep05);

    結果似乎有成功寫入, 只是發生IoTimedOut事件...還在繼續測試


    • 已編輯 _Wayne56 2019年3月13日 上午 02:49
    2019年3月13日 上午 02:44
  • 看了一下文件, 87的錯誤好像是Device不存在
    2019年3月13日 上午 05:57
  • 看了一下文件, 87的錯誤好像是Device不存在

    應該是, Reader改成Ep04, Writer改成Ep05後, 在Read/Write時就沒那個例外了

    但是在read時一直timeout, 不過測試過程中有莫名成功一次, 還在找問題

    以下是目前的code

                        int bytesWritten;
                        ec = writer.Write(buffer, 2000, out bytesWritten);
    if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString); ec = writer.Write(buffer2, 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. if ((bytesRead != 0)) Console.Write(Encoding.Default.GetString(readBuffer, 0, bytesRead)); } Console.WriteLine("\r\nDone!\r\n");


    • 已編輯 _Wayne56 2019年3月13日 上午 06:28
    2019年3月13日 上午 06:26
  • Hi, tihs

    有找到問題了..原來是設備端沒有寫好..

    謝謝你花時間幫我看!

    2019年3月13日 上午 07:55
  • 還有一個錯誤是

    var buffer = new byte[64];

    要寫成

    byte [] buffer = new byte[64];

    ...

    • 已標示為解答 _Wayne56 2019年3月15日 上午 08:43
    2019年3月14日 上午 01:47