SerialPort и BSOD - PullRequest
       32

SerialPort и BSOD

2 голосов
/ 02 ноября 2008

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

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

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

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


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

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

Эпилог

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

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

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

Ответы [ 4 ]

2 голосов
/ 05 ноября 2008

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

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

2 голосов
/ 02 ноября 2008

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

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

0 голосов
/ 31 августа 2009

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

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

W

0 голосов
/ 03 ноября 2008

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

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

...