Проблема с SerialPort

Я работаю с SerialPort для передачи (только для чтения) со считывателем штрихкода.

Я установил драйвер для работы с читателем, как будто он был соединен через, Соответствуют, хотя это - USB-устройство. Когда устройство включается, еще один Соответствовать появляется в списке.

Проблема следующая. Я инициализирую объект SerialPort читать из считывателя штрихкода, но если читатель отключается, у меня нет способа завершить или расположить объект SerialPort правильно, потому что порт, к которому он не "присоединяется" больше, существует.

Результатом является WinIOException, когда программа закрывается. Я не могу поймать его не только в коде, работающем с SerialPort, но и на program.cs уровне также. Согласно стеку WinIOException брошен после попыток завершения и расположения объекта SerialPort.

Есть ли какие-либо идеи, как я могу действовать с этой ситуацией правильно? Или по крайней мере поймать исключение?

Вещь, которую я знаю наверняка, состоит в том, что проблема не находится в этом конкретном драйвере; у меня был еще один считыватель штрихкода от другого производителя (с тем же драйвером цели) - ситуация является тем же.

8
задан Panagiotis Kanavos 12 July 2010 в 19:08
поделиться

3 ответа

Вздох, это давняя проблема с эмуляторами последовательного порта USB. Последовательные порты - это устройства, датируемые каменным веком. Раньше они ввинчивались в шину, и их невозможно было удалить, пока программа использует их, не создавая искр и клубящегося дыма. Каменный век также включает в себя отсутствие какой-либо поддержки plug-and-play, чтобы программа могла обнаружить, что устройство внезапно стало гонзо.

К сожалению, большинство неработающих драйверов устройств, которые их эмулируют, просто заставляют их исчезнуть, даже если программа открыла порт. Это работает примерно так же, как выдергивание флешки из гнезда, когда Windows записывает на нее файлы. Есть фоновый рабочий поток, который ожидает уведомлений от драйвера устройства, чтобы он мог генерировать события DataReceived, ErrorReceived и PinChanged. Этот поток страдает сердечным приступом, когда устройство внезапно исчезает. Вы не можете это уловить, это поток, который был запущен классом SerialPort, вы не можете обернуть его с помощью try / catch.

По многочисленным просьбам Microsoft кое-что сделала в .NET 4.0. Не совсем уверен, что происходит в этом выпуске. Если вы застряли на более ранней версии, единственное разумное решение, которое вы можете сделать, - это прикрепить наклейку рядом с USB-разъемом: «Не удаляйте при использовании!» Что неизбежно заставляет кого-то отключать устройство как минимум дважды, чтобы посмотреть, что произойдет.После чего им это наскучит, и они оставят вас в покое.

Очень необоснованный обходной путь - файл app.exe.config со следующим содержимым:

<?xml version ="1.0"?>
<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
  </runtime>
</configuration>

Не используйте его.

13
ответ дан 5 December 2019 в 07:56
поделиться

Вы можете унаследоваться от SerialPort и переопределить метод Dispose() для обработки таких исключений. Вы можете просто проглотить исключение (Dispose не должен бросать в любом случае).

Если вы хотите записать исключение в журнал или обработать его каким-то другим способом, вам придется сначала проверить флаг disposing. Если он равен false, это означает, что Dispose был вызван деструктором SerialPort и объект уже осиротел.

Например,

    public class MySerialPort:SerialPort
    {
        protected override void Dispose(bool disposing)
        {
            try
            {
                base.Dispose(disposing);
            }
            catch (Exception exc )
            {                    
                if (disposing)
                {
                    //Log the error
                }
            }

        }
    }
2
ответ дан 5 December 2019 в 07:56
поделиться

Плохие новости.

Решение от Panagiotis Kanavos не помогает. Проблема все еще здесь.

.Net 4.0 тоже не помогает. Я установил VS2010 - ничего не изменилось. Неисправленное исключение по-прежнему выбрасывается. К сожалению, "заклеил табличку рядом с USB-разъемом: "Don't remove while in use!", похоже, является единственным решением...

0
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: