2009-06-04 4 views
1

일반적으로 PC에는 터미널 에뮬레이터에서 사용할 수있는 비표준 COM 포트 집합이 있습니다. 나는 COM1-COM32 포트를 스캔하여 직렬 포트로 열 수있는 포트가 있는지 확인할 수 있기를 원합니다. 나는이 모든 포트에서 CreateFile()을 호출하는 것만으로도이 작업을 수행 할 수 있습니다. 그러나 실제로 포트를 일시적으로 열거 나 닫기 (DTR/RTS에 영향을 미침)해야합니다.COM 포트를 실제로 열지 않고 열 수 있는지 확인할 수 있습니까?

사용할 수있는 포트의 사용자에게 정확한 목록을 제공하고자합니다. 문제는 DTR/RTS에서 전환을보고 싶지 않은 포트에 하드웨어가 연결되어있을 수 있으므로 현재 사용되지 않는 포트의 DTR/RTS 라인에 영향을 미치고 싶지 않다는 것입니다.

"CreateFile()이 성공할 것인가?"라는 질문을하는 방법이 있습니까? 지정된 COM 포트에 있습니까?

답변

1

여러 가지 방법

) QueryDosDevice() - 이름에서 COM에 대해

B 확인) GetDefaultCommConfig() - 예를 들면, 모든 가능한 시리얼 이름을 통해 이동합니다. , COM1, COM2에 대한 설정을 좀하려고 ... COMN

C) HKLM/하드웨어/DEVICEMAP/SERIALCOMM - 키를 열거

D) SetupAPI를 - 내가 광범위하게상의없이이를 사용하는 방법을 기억한다면 참조 설명서 나는 인간이 아닐 것이다

e) ???

편집 됨 : Peter가 지적한대로 열거 형을 넘어서서 장치에 액세스 할 수 있는지 여부를 알 수있는 기능이 없습니다.

+0

내가 알고있는 단 하나는 GetDefaultCommConfig()이며, API는 간단하지만 아직까지는 성공하지 못했습니다. 트릭이 있습니까? 그것의 바로 하나의 문자열, 구조체에 대한 포인터, 그 뒤에 (구조체의) 채워진 크기 값에 대한 포인터가옵니다. 충분히 단순 해 보이지만 작동시키지 못했습니다. 감사합니다, –

+0

내가 사용하는 코드 스 니펫 ... 잘못된 것이 있으면 큰 소리로 외칩니다. :-) void somefunc (void) { COMMCONFIG cc; DWORD bsize = sizeof (COMMCONFIG); if (GetDefaultCommConfig ("COM1", & cc, & bsize) == 0) { ShowLastError ("GetDefaultCommConfig()"); 반환; } ... } –

+0

죄송합니다.나는 그것이 더 형식화되기를 바랐다. :-( –

2

아니요, 이러한 질문을하는 방법은 없습니다. 어쨌든 대답은 의미가 없을 것입니다. 운영 체제가 COM 포트를 여는 것이 어느 시점에 성공할 것이라고 판단한다고해도 나중에 열 수는 없습니다. SetupDiXXX 함수를 사용하여 시스템의 COM 포트를 열거 할 수 있지만 설치되고 활성화 된 드라이버에 대한 정보 만 반환됩니다. 그 이상의 보증은하지 않습니다.

+0

이론 상으로는 동의하지만, 제 상황에서는 WinPC가 일반적으로 단일 사용자이고 포트 가용성에 대한 빠르고 눈에 띄지 않는 검사가 유용하다고 가정 할 수 있습니다 특히 실제 COM 포트와 COMX 값이 인접하지 않는 일부 USB 포트가 혼합 된 경우 감사합니다. –

0

HKLM/HARDWARE/DEVICEMAP/SERIALCOMM이 가장 좋습니다.

이 솔루션은 가장 쉬운 구현과 정확도 비율 IMO를 보여줍니다.

HW가 항상 거기에 나열되어 있지 않은 직렬 포트 USB (FTDI IIRC) 제조업체가 적어도 한 명은 있지만 충분히 정확합니다.

관련 문제