Устройство USB продолжает подключаться и отключаться после остановки приложения libusbdotnet - PullRequest
0 голосов
/ 15 февраля 2019

Я отправляю команду считывателю QR-кода каждые 30 миллисекунд, беру ответ и отображаю его размер на этикетке.Кажется, что все работает нормально, пока я не нажму кнопку «Стоп», после чего я постоянно слышу звук подключения / отключения Windows USB.Звук исчезнет, ​​если я отключу USB-устройство и подключу его снова.Что может быть не так?

    public ReaderForm()
    {
        InitializeComponent();
    }

    private void ReaderForm_Load(object sender, EventArgs e)
    {
        _timer = new System.Windows.Forms.Timer();
        _timer.Interval = 270;
        _timer.Tick += new EventHandler(_timer_Tick);
    }

    private void ConnectButton_Click(object sender, EventArgs e)
    {
        _errorCode = ErrorCode.None;

        _myUsbFinder = new UsbDeviceFinder(0x0c2e, 0x0b6a);
        // 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.");

        IUsbDevice wholeUsbDevice = _myUsbDevice as IUsbDevice;
        if (!ReferenceEquals(wholeUsbDevice, null))
        {
            // Select config #1
            wholeUsbDevice.SetConfiguration(1);

            // Claim interface #0.
            wholeUsbDevice.ClaimInterface(2);
        }

        _writer = _myUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep07);
        _reader = _myUsbDevice.OpenEndpointReader(ReadEndpointID.Ep02);

    }


    private void StartButton_Click(object sender, EventArgs e)
    {
        _timer.Interval = Convert.ToInt32(speedTextBox.Text);
        _timer.Start();
    }

    private void StopButton_Click(object sender, EventArgs e)
    {
        if (_myUsbDevice != null)
        {
            if (_myUsbDevice.IsOpen)
            {
                IUsbDevice wholeUsbDevice = _myUsbDevice as IUsbDevice;
                if (!ReferenceEquals(wholeUsbDevice, null))
                {
                    // Release interface #2.
                    wholeUsbDevice.ReleaseInterface(2);
                }
                _myUsbDevice.Close();
            }
        }
        _myUsbDevice = null;

        // Free usb resources
        UsbDevice.Exit();
        _timer.Stop();


    }
    private void _timer_Tick(object sender, EventArgs e)
    {
        try
        {
            if (!String.IsNullOrEmpty(cmdLine))
            {
                int bytesWritten;

                _errorCode = _writer.Write(Encoding.Default.GetBytes(cmdLine), 0, cmdLine.Length, 40, out bytesWritten);
                Console.WriteLine("Bytes Written: {0} ", bytesWritten, _errorCode);

                if (_errorCode != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString);

                _reader.DataReceived += (_onRxEndPointData);
                _reader.DataReceivedEnabled = true;

                label1.Text = _findImageSize().ToString();
                Response = "";
                // 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((_errorCode != ErrorCode.None ? _errorCode + ":" : String.Empty) + ex.StackTrace);
        }
        finally
        {
        }
    }

    private static void _onRxEndPointData(object sender, EndpointDataEventArgs e)
    {
        Response += Encoding.Default.GetString(e.Buffer, 0, e.Count);
    }

    public static int _findImageSize()
    {
        int imageSizeInBytes = 0;
        byte[] responseBytes = Encoding.Default.GetBytes(Response);
        for (int i = 0; i < responseBytes.Length; i++)
        {
            if (responseBytes[i] == 0x1d)//Find the start of the image data
            {
                i++;
                imageSizeInBytes = responseBytes.Length - i;
                break;
            }
        }
        return imageSizeInBytes;
    }

[ОБНОВЛЕНИЯ] Я попробовал несколько различных реализаций сейчас, используя асинхронную работу, библиотеку winusb, и я пытался очистить конечные точки и прервать их, а также множество других подходов за последние 3 дня.Короче я перепробовал все возможное и проблема продолжается.Я решил, что единственный способ решить эту проблему - эмулировать поведение меня, удаляя устройство из USB-порта и подключая его снова.Можно ли как-то определить точный порт, к которому подключено USB-устройство, и выключить и снова включить его в C #?

1 Ответ

0 голосов
/ 25 марта 2019

Я заметил, что ответ отправлялся в 5-6 пакетах.Всякий раз, когда я писал команду и не читал все пакеты с помощью команды чтения (я прекращал чтение до получения полного ответа), мой компьютер начинал издавать этот звук.Чтобы исправить это, я использовал логическое значение, чтобы указать, был ли получен полный ответ, и всякий раз, когда мне приходилось останавливать программу, я откладывал остановку следующим образом:

while(!responseComplete){
};

_timer.Stop();
...