SerialPort и BSOD

Я написал некоторый код C#, который проверяет, присутствует ли устройство на каком-либо SerialPort, выдавая команду на порту и прослушивая ответ. Когда я просто устанавливаю скорость порта, открываю порт, получаю последовательный поток и начинаю обработку, он работает в 100% случаев. Однако некоторые из наших устройств работают на разных скоростях, и я пытаюсь найти устройство на разных скоростях, чтобы автоматически согласовать соединение, а также обнаружить присутствие устройства.

Когда я делаю все это в одном потоке, проблем нет. Однако 3-секундный тайм-аут на десяти скоростях составляет 30 с на последовательный порт, и их может быть несколько. Отсюда и желание прощупать все порты одновременно.

Иногда это работает. Иногда синие экраны Висты. Когда я использую потоки для одновременного исследования всех портов, почти всегда возникают синие экраны. Когда я заставляю все работать в одном потоке, этого никогда не происходит.

USB-последовательный адаптер Prolific PL-2303 используется с драйверами x64.


@Vinko - спасибо за совет по чтению минидампов.

Насколько я могу судить, суть проблемы заключается в том, что, запустив новую операцию асинхронного ввода-вывода из другого потока, можно придать совершенно новый смысл перекрывающемуся вводу-выводу, вызывая состояние гонки внутри драйвера. Поскольку драйвер выполняется в режиме ядра, БУМ!

Эпилог

За исключением запуска, не используйте BeginXxx вне обработчика обратного вызова и не вызывайте BeginXxx до тех пор, пока вы не вызовете EndXxx, потому что вы вызовете состояние гонки в коде драйвера, который работает в режиме ядра.

Постскриптум

Я обнаружил, что это также относится к потокам сокетов.


person Peter Wone    schedule 02.11.2008    source источник
comment
вы можете использовать windbg на минидампах, чтобы проверить точную ошибку, что приведет к более точному поиску   -  person Vinko Vrsalovic    schedule 02.11.2008
comment
microsoft.com/whdc/devtools/debugging/default.mspx   -  person Vinko Vrsalovic    schedule 02.11.2008


Ответы (4)


Однажды написав драйверы Windows для одного из таких устройств, я бы посоветовал не тратить время на WinDbg, пытаясь доказать то, что вы уже знаете, то есть, что используемый вами драйвер содержит ошибки.

Если вы можете найти более свежий драйвер от PL2302, попробуйте его, но я рекомендую, если вам нужно использовать адаптеры USB-> Serial, лучше всего использовать адаптеры на основе FTDI. (Это не те, для которых я писал драйверы...)

person Will Dean    schedule 05.11.2008
comment
Вина была моя. Я вызвал состояние гонки. Я согласен с тем, что драйвер должен ОБРАБАТЫВАТЬ исключение, а не синий экран ОС, но ошибка была моей, и она исправлена ​​/ - person Peter Wone; 07.11.2008
comment
Вы очень благотворительны! Вы НИЧЕГО не должны делать в коде пользовательского режима, который вызывает синий экран - драйвер должен быть в состоянии справиться с любым возможным порядком запросов ввода-вывода без сбоев. - person Will Dean; 11.11.2008
comment
Черт, драйверы не должны работать в кольце 0. Но из соображений производительности они работают. Благодать принять то, что я не могу изменить, понимаете? - person Peter Wone; 01.09.2009

Вы также можете отключить «Автоматический перезапуск» в разделе «Свойства системы\Дополнительно\Запуск и восстановление\Настройки». Как только вы отключите это, вы сможете увидеть BSOD и найти сообщение об ошибке, например. IRQL_LESS_OR_EQUAL, выполнив поиск по этому имени ошибки, вы обычно можете сузить круг до источника проблемы.

Кстати, в настоящее время не многие ноутбуки поставляются с последовательными портами, поэтому вы должны использовать преобразователь USB-Serial? Если это так, то драйвер мог быть проблемой для начала, поскольку большинство производителей написали драйвер последовательного порта как виртуальный драйвер.

person faulty    schedule 02.11.2008
comment
Я видел проблемы BSOD с сомнительными USB-драйверами раньше — именно с этого я бы начал искать. - person Jon B; 02.11.2008
comment
Это порт USB, и я знаю, что о таких проблемах сообщалось. Я также знаю, что конечные пользователи будут считать, что, поскольку часть их программного обеспечения работает с USB-адаптером, все должно работать, и я должен с ними согласиться. Как отмечалось выше, это работает, когда все происходит в одном потоке. - person Peter Wone; 04.11.2008
comment
Я отключил автозапуск по вашему совету. В настоящее время я не получаю синие экраны, потому что я переписал всю обработку порта в одном потоке, но если это повторится, я, по крайней мере, смогу просмотреть сообщение. - person Peter Wone; 04.11.2008

BSOD обычно означает глючные драйверы.

Какие аппаратные порты вы используете? У меня были BSODы с драйверами конвертеров SiLabs CP21xx USB to Serial.

person Serge Wautier    schedule 02.11.2008
comment
Я нашел сайт производителя чипсета и попробую другие драйвера. Мои возможности ограничены из-за необходимости драйверов x64. - person Peter Wone; 04.11.2008

Есть драйвера FTDI, которые стабильно работают под x64 vista и win7. Я поддерживаю человека, который сказал использовать только чипсеты FTDI.

Большинство дешевых серийных ключей USB в магазинах рядом со мной (Торонто, Канада) кажутся чипами FTDI. Этого никогда не бывает на коробке, поэтому я покупаю одну, и если она хорошая, я иду покупать полную коробку.

W

person Warren P    schedule 31.08.2009