2017-12-18 132 views
2

IM試圖寫和\爲USB讀取... 我Win32Error上UsbLibDotNetTest例子不爲我工作

ec = reader.Read(readBuffer, 10000, out bytesRead); 

,我在bytesRead得到0比它拋出的異常(「沒有更多的字節!「);

if (bytesRead == 0) throw new Exceptio`enter code here`n("No more bytes!"); 

當我嘗試使用串口對象使用端口rs232時,我寫了下一個字符串,這個字符串工作得很好。 但它並不適用於USB端口工作...

string cmdLine = @"@01WD300000295B*"+(char)13; 

也許是存在於C#線的SerialPort任何對象USB端口? 我沒有找到任何關於它,我不知道還有什麼我可以做...

using System; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Text.RegularExpressions; 
    using LibUsbDotNet; 
    using LibUsbDotNet.Main; 
    using System.Threading; 

    namespace UsbLibDotNetTest 
    { 

     public partial class Form1 : Form 
     { 
      public static UsbDevice MyUsbDevice; 

      #region SET YOUR USB Vendor and Product ID! 

      public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x0590, 0x005B); 
      #endregion 
      public Form1() 
      { 
       InitializeComponent(); 
      } 

      private void Form1_Load(object sender, EventArgs e) 
      { 
       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); 

        string cmdLine = @"@01WD300000295B*"+(char)13; 

        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; 
          Thread.Sleep(10000); 
          // If the device hasn't sent data in the last 100 milliseconds, 
          // a timeout error (ec = IoTimedOut) will occur. 
          ec = reader.Read(readBuffer, 10000, 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(); 
       } 
      } 
     } 
    } 
+0

也許有人知道另一種方式來做到這一點? – dudi

回答

0

我發現,並不是所有的USB轉串口轉換似乎工作。我使用的是Ugreen USB to Serial。這適用於Windows 7和Windows 10上的我。 http://www.ugreen.com.cn/product-681-en.html 其他已經工作的轉換器是Sabrent。然而,這隻適用於Windows XP和Windows 7. Regards, Garry

+0

嗨,我更喜歡在C#中使用類而不是轉換器... – dudi