문제

나는 포트에 명령을 발행하고 응답을 듣고 장치가 세리안 포트에 있는지 확인하는 C# 코드를 작성했습니다. 포트 속도를 설정하고 포트를 열고 직렬 스트림을 가져 와서 처리를 시작하면 100%의 시간이 작동합니다. 그러나 일부 장치는 다른 속도로 작동하며 다양한 속도로 장치를 검토하여 연결을 자동으로 측정하고 장치 존재를 탐지하려고합니다.

이 모든 것을 단일 스레드로 수행하면 아무런 문제가 없습니다. 그러나 10 속도로 3s 타임 아웃은 직렬 포트 당 30 초이며 몇 가지가있을 수 있습니다. 따라서 모든 포트를 동시에 조사하려는 욕구.

때때로 이것은 작동합니다. 때때로 Vista Bluescreens. 스레드를 사용하여 모든 포트를 동시에 프로브 할 때 거의 항상 Bluescreens입니다. 모든 것이 하나의 스레드로 실행되도록 강요하면 결코 일어나지 않습니다.

X64 드라이버와 함께 USB- 서식 PRELIFIC PL-2303 어댑터가 사용되고 있습니다.


@Vinko- Minidumps를 읽는 팁에 감사드립니다.

내가 알 수있는 한, 문제의 요점은 새로운 비동기 I/O 작업을 시작함으로써 다른 스레드에서 중첩 된 I/O에 완전히 새로운 의미를 부여하여 운전자 내부의 경주 상태를 유도 할 수 있습니다. 드라이버는 커널 모드에서 실행되므로 비난!

발문

킥오프를 제외하고는 콜백 핸들러 외부에서 startxxx를 사용하지 말고 endxxx를 호출 할 때까지 startxxx를 호출하지 마십시오. 커널 모드에서 실행되는 드라이버 코드에서 레이스 조건을 유도하기 때문입니다.

추신

나는 이것이 소켓 스트림에도 적용된다는 것을 발견했다.

도움이 되었습니까?

해결책

이런 종류의 장치 중 하나에 대한 Windows 드라이버를 한 번 작성한 후에는 WindBG와 함께 시간을 낭비하지 않아도됩니다. 즉, 이미 알고있는 것을 증명하려고 노력합니다. 즉, 당신이 사용하는 드라이버가 버그가된다는 것입니다.

PL2302에서 더 최신 드라이버를 찾을 수 있다면 시도해 보지만 USB-> 직렬 어댑터를 사용해야한다면 FTDI 기반 어댑터를 사용해야하는 것이 좋습니다. (그들은 ~ 아니다 내가 운전자를 쓴 것도 ...)

다른 팁

시스템 속성 advanced start and recovery 설정에서 "자동 재시작"을 비활성화 할 수도 있습니다. 일단 비활성화되면 BSOD를보고 오류 메시지를 찾을 수 있으며, 예를 들어 IRQL_LESS_OR_EQUAL (예 : 해당 오류 이름을 검색하여 문제의 출처로 좁힐 수 있습니다.

BTW, 오늘날 노트북이 많은 노트북이 제공되지 않으므로 USB- 시리얼 컨버터를 사용해야합니까? 이 경우 대부분의 제조업체가 직렬 포트 드라이버를 가상 드라이버로 작성했기 때문에 운전자는 처음부터 문제가되었을 수 있습니다.

BSOD는 일반적으로 버기 드라이버를 의미합니다.

어떤 종류의 HW 포트를 사용하십니까? SILABS CP21XX USB가 직렬 변환기 드라이버에 BSOD를 가지고있었습니다.

X64 Vista 및 Win7에 따라 안정된 FTDI 드라이버가 있습니다. 두 번째는 FTDI 칩셋 만 사용한다고 말한 사람입니다.

근처의 상점 (캐나다 토론토)에서 USB 동글에 대한 저렴한 연재물의 대부분은 FTDI 칩 인 것 같습니다. 그것은 상자에 결코 없어서, 나는 하나를 사고, 그것이 좋으면, 나는 그들로 가득 찬 상자를 사러 간다.

w

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top