Как постоянно проверить, подключено ли / отключено ли последовательное устройство в UWP C #? - PullRequest
0 голосов
/ 15 октября 2019

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

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

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

1 Ответ

0 голосов
/ 16 октября 2019

Вы можете попробовать использовать DeviceWatcher . DeviceWatcher используется для динамического перечисления всех устройств, ваше приложение может получать уведомления, если устройства добавляются, удаляются или изменяются после завершения начального перечисления. Если USB-Com добавлен, он вызовет DeviceWatcher.Added Event , а при удалении устройства он вызовет DeviceWatcher.Removed Event . Обратите внимание, что когда устройство отключается, оно вызывает событие удаления устройства, но все ожидающие операции должны быть надлежащим образом отменены, а все ресурсы необходимо очистить. Пожалуйста, обратитесь к следующему коду в 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;
    }
}
...