SerialPort и BSOD
-
05-07-2019 - |
Вопрос
Я написал некоторый код на C #, который проверяет, присутствует ли устройство на любом SerialPort, отправляя команду на порт и ожидая ответа.Когда я просто устанавливаю скорость порта, открываю порт, получаю последовательный поток и начинаю обработку, это работает в 100% случаев.Однако некоторые из наших устройств работают на разных скоростях, и я пытаюсь проверить наличие устройства на разных скоростях, чтобы автоматически согласовать соединение, а также обнаружить присутствие устройства.
Когда я делаю все это в одном потоке, проблем не возникает.Однако тайм-аут в 3 секунды при десяти скоростях равен 30 секундам на последовательный порт, и их может быть несколько.Отсюда и желание прощупать все порты одновременно.
Иногда это срабатывает.Иногда Vista меняет цвет экрана.Когда я использую потоки для одновременного зондирования всех портов, это почти всегда синеватый экран.Когда я заставляю все запускаться в одном потоке, этого никогда не происходит.
Адаптер Prolific PL-2303 с последовательным интерфейсом USB используется с драйверами x64.
@Vinko - спасибо за совет по чтению мини-дампов.
Насколько я могу судить, суть проблемы заключается в том, что при запуске новой операции асинхронного ввода-вывода из другого потока можно придать совершенно новое значение перекрывающемуся вводу-выводу, вызывая состояние гонки внутри драйвера.Поскольку драйвер выполняется в режиме ядра, БАМ!
Эпилог
За исключением запуска, не используйте BeginXXX вне обработчика обратного вызова и не вызывайте BeginXXX до тех пор, пока вы не вызовете EndXXX, потому что вы вызовете состояние гонки в коде драйвера, который выполняется в режиме ядра.
Постскриптум
Я обнаружил, что это также относится к потокам сокетов.
Решение
Однажды написав драйверы для Windows для одного из этих устройств, я бы посоветовал не тратить время на WinDbg, пытаясь доказать то, что вы уже знаете - то есть, что используемый вами драйвер глючит.
Если вы можете найти более свежую версию драйвера от PL2302, попробуйте это, но я рекомендую вам, если вам нужно использовать USB-> последовательные адаптеры, лучше использовать адаптеры на основе FTDI. (Они тоже не , для которых я написал драйверы ...)
Другие советы
Вы также можете отключить " Автоматический перезапуск " в Свойства системы \ Дополнительно \ Пуск и восстановление \ Настройки. Как только вы отключите это, вы можете увидеть BSOD и найти сообщение об ошибке, например, IRQL_LESS_OR_EQUAL, выполняя поиск по этому имени ошибки, вы обычно можете сузить источник проблемы.
Кстати, не так много ноутбуков поставляется с последовательными портами в настоящее время, так что вы должны использовать USB-Serial Converter? Если это так, возможно, с самого начала возникла проблема с драйвером, поскольку большинство производителей записали драйвер последовательного порта в качестве виртуального драйвера.
BSOD обычно означает глючные драйверы.
Какие порты HW вы используете? У меня были BSOD с драйверами SiLabs CP21xx USB to Serial.
Существуют драйверы FTDI, которые стабильны под управлением x64 Vista и win7.Я поддерживаю человека, который сказал использовать только чипсеты FTDI.
Большинство дешевых последовательных USB-ключей в магазинах рядом со мной (Торонто, Канада), похоже, являются чипами FTDI.Их никогда нет на коробке, поэтому я покупаю одну, и если она хороша, я иду покупать полную их коробку.
W