Как постоянно проверять, подключается / отключается последовательное устройство в UWP C #?

У меня есть приложение UWP, работающее в Windows IoT на Raspberry Pi. Мне нужно подключить несколько сканеров штрих-кода через USB-Com и получать данные через последовательный порт. Как лучше всего распознать, отключается или подключается устройство? Прямо сейчас каждый сканер штрих-кода выполняет цикл. Если он выдает исключение во время ожидания данных, я знаю, что он физически отключен. Затем я пытаюсь повторно подключить его, создав новый последовательный порт с помощью устройств HardwareString (которые содержат PID и VID). Если это не удастся, он будет работать в бесконечном цикле, пытаясь создать исключения для последовательного порта, потому что устройство физически не отключено. Это будет продолжаться до тех пор, пока устройство не повторно подключится физически и не сможет создать последовательный порт для приема данных на нем.

Есть ли более элегантный способ постоянно проверять конкретное устройство с помощью HardwareString?

Большое тебе спасибо.


person sebastian.verwohlt    schedule 15.10.2019    source источник


Ответы (1)


Вы можете попробовать использовать DeviceWatcher. DeviceWatcher используется для динамического перечисления всех устройств, ваше приложение может получать уведомления, если устройства добавляются, удаляются или изменяются после завершения начального перечисления. Если USB-Com добавлен, он вызовет DeviceWatcher .Added Event, когда устройство удалено, оно вызовет Событие DeviceWatcher.Removed. Обратите внимание, что когда устройство отключается, оно вызывает событие удаления устройства, но все ожидающие операции необходимо отменить должным образом, а все ресурсы необходимо очистить. См. Следующий код в EventHandlerForDevice < / а>. Обратный вызов в коде используется для явного закрытия устройства для очистки ресурсов, правильной обработки ошибок и прекращения взаимодействия с отключенным устройством.

private async void CloseCurrentlyConnectedDevice()
{
    if (device != null)
    {
        // Notify callback that we're about to close the device
        if (deviceCloseCallback != null)
        {
            deviceCloseCallback(this, deviceInformation);
        }

        // This closes the handle to the device
        device.Dispose();

        device = null;
    }
}
person Michael Xu - MSFT    schedule 16.10.2019
comment
Спасибо, попробую. - person sebastian.verwohlt; 16.10.2019
comment
Не стесняйтесь, дайте мне знать, если у вас возникнут проблемы. - person Michael Xu - MSFT; 16.10.2019
comment
Честно говоря, мне сложно создать DeviceWatcher специально для моих устройств, которые могут быть или не могут быть физически подключены к Raspberry Pi. Я получаю HardwareString устройств из xml-файла, десериализуемого в начале приложения. Но как я могу создать наблюдателя только с этой информацией? - person sebastian.verwohlt; 17.10.2019
comment
Вы не можете создать наблюдателя только с этой информацией, но вы можете фильтровать устройство по DeviceInformation при добавлении или удалении инициированного события. - person Michael Xu - MSFT; 17.10.2019