Вопрос

Я написал некоторый код на 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top