Pergunta

Eu escrevi algum código C # que verifica se um dispositivo está presente em qualquer SerialPort emitindo um comando na porta e ouvir uma resposta. Quando eu apenas definir a velocidade da porta, abrir a porta, obter o fluxo de série e iniciar o processamento, ele funciona 100% do tempo. No entanto, alguns de nossos dispositivos funcionam em velocidades diferentes e eu estou tentando sondar para um dispositivo em várias velocidades autonegociar uma conexão, bem como detectar a presença do dispositivo.

Quando eu fazer tudo isso em um único segmento não há problemas. No entanto, a velocidades de tempo limite 3s dez 30s é por porta série, e pode haver vários. Daí o desejo de investigar todas as portas simultaneamente.

Às vezes isso funciona. Às vezes, Vista bluescreens. Quando eu usar tópicos para sondar todas as portas simultaneamente quase sempre bluescreens. Quando eu forçar tudo para ser executado em um segmento que isso nunca aconteça.

Um adaptador Prolific PL-2303 USB-serial está em uso com x64 motoristas.


@Vinko - obrigado pela dica sobre minidumps leitura.

tão perto quanto eu posso dizer, o cerne do problema é que, iniciando uma nova operação assíncrona I / O a partir de um segmento diferente , é possível dar um novo significado à I sobreposta / o, induzindo uma condição de corrida no interior do motorista. Uma vez que os executa driver em modo kernel, BLAM!

Epílogo

exceto para chutar fora, não use BeginXxx fora do manipulador de retorno e não chamar BeginXxx até que você tenha chamado EndXxx, porque você vai induzir uma condição de corrida no código do driver que é executado em modo kernel.

Postscript

Eu descobri que isso também se aplica aos fluxos de soquete.

Foi útil?

Solução

Tendo drivers do Windows escritas para um destes tipo de dispositivo de uma vez, o meu conselho seria para não desperdiçar seu tempo com WinDbg tentando provar que você já sabe -. Ou seja, que o driver que você está usando é buggy

Se você puder encontrar um driver mais up-to-date do PL2302, em seguida, tentar isso, mas a minha recomendação é que se você tem que usar USB-> adaptadores de série, os baseados em FTDI são os melhores. (Eles são não o que eu escrevi os drivers para, ou ...)

Outras dicas

Você também pode desativar o "reinício automático" em Sistema Propriedades \ Avançado \ Start e Recuperação \ Configurações. Depois de desativar isso, você pode ver o BSOD e olhar para a mensagem de erro, por exemplo, IRQL_LESS_OR_EQUAL, procurando por esse nome de erro, geralmente você pode diminuir a origem do problema.

Btw, não muitos notebook vem com portas seriais hoje em dia, por isso você deve estar usando conversor USB-Serial? Se for esse o caso, o motorista pode ter sido um problema para começar, já que a maioria fabricante escreveu o driver porta serial como piloto virtual.

BSOD geralmente significa que os condutores de buggy.

Que tipo de HW portas que você usa? Eu tive BSODs com Silabs CP21xx USB para conversores serial motoristas.

Existem motoristas FTDI que são estáveis ??sob Vista x64 e Win7. Eu segundo a pessoa que disse para usar apenas chipsets FTDI.

A maior parte da série barato para dongles USB nas lojas perto de mim (Toronto, Canadá) parecem ser fichas FTDI. Nunca é na caixa, então eu comprar um, e se for bom, vou comprar uma caixa cheia deles.

W

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top