2015-01-12 6 views
2

USB 포트 (COM15)를 통해 일부 직렬 통신을 시도하고 있으며 오류가 발생합니다.CreateFile() 직렬 통신 문제

HANDLE myPortHandle = CreateFile("COM15", 
            GENERIC_READ | GENERIC_WRITE, 
            0, 
            NULL, 
            OPEN_EXISTING, 
            0, 
            NULL); 

if (myPortHandle == INVALID_HANDLE_VALUE) 
{ 
    DWORD lastError = GetLastError(); 
    cout<<"ERROR HERE! = "<<lastError<<endl; 
} 

나는 프로그램, 열린 직렬 포트 == INVALID_HANDLE_VALUE에 대한 핸들을 컴파일 할 때마다이 오류가 발생하는 코드입니다. CreateFile() msdn 설명서에서 GetLastError()를 사용하여 "확장 오류 정보"를 읽었습니다. 나는이 코드를 실행하면 이제 ..., GetLastError가()의 값을 반환 GetLastError()의 MSDN 설명서에서 2

를, 그것은 말한다 :

"각 기능에 대한 문서의 반환 값 섹션 마지막 오류 코드는 함수가 마지막 오류 코드를 설정하는 조건을 나타냅니다. "

나는 CreateFile() msdn 문서의 반환 값 섹션에서 '2'의 의미를 찾고 어디에서나 의미를 찾을 수 없습니다.

질문 :

1)이 일어나는 이유 : myPortHandle == INVALID_HANDLE_VALUE?

2) 또한, 누군가가 msL 설명서에서 GetLastError()로 반환 된 '2'의 의미를 찾는 데 필요한 부분을 안내 할 수 있다면 정말 멋지 겠지요!

+0

웹에서 작동 코드를 검색하면 새로운 것을 발명하지 않습니다. –

+0

@UlrichEckhardt 실제로 했어요. COM1에서 COM9까지 모두 사용하는 코드를 발견하기에는 불행했습니다. 너는 해결되었다. – CodeBlocks

+0

이것은 100 배가 넘는 속임수이다. 안타깝게도 Google이나 SO 검색은 정확한 구문으로'\\. \ COM'과 일치 할 수 없다. –

답변

6

Windows 오류 코드는 여기에 설명되어 있습니다 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx

귀하의 오류 코드 ERROR_FILE_NOT_FOUND입니다. 즉 COM15을 찾을 수 없습니다. this article에 따르면 "\\\\.\\COM15"이라는 이름을 사용해야합니다.

시리얼 포트에 대한 핸들을 얻는 데 사용할 수 있습니다. "CreateFile()"의 "Win32 Programmer 's Reference"항목에 공유 모드가 0이어야하며 create 매개 변수는 OPEN_EXISTING, 이어야하며 템플릿은 NULL이어야 함을 언급합니다.

파일 이름에 "COM1"에서 "COM9"를 사용하면 CreateFile()이 성공합니다. 그러나 "COM10"이상을 사용하는 경우 메시지 INVALID_HANDLE_VALUE은 입니다. 다음과 같이

포트의 이름 \\.\COM10, CreateFile이 (의 호출에 시리얼 포트를 지정하는 올바른 방법 인 경우

)입니다 :

CreateFile(
    "\\\\.\\COM10",  // address of name of the communications device 
    fdwAccess,   // access (read-write) mode 
    0,     // share mode 
    NULL,    // address of security descriptor 
    OPEN_EXISTING,  // how to create 
    0,     // file attributes 
    NULL    // handle of file with attributes to copy 
); 

참고 :이 구문은 또한을 통해 포트 COM1을 작동 COM9. 특정 보드에서는 포트 이름을 직접 선택할 수 있습니다. 이 구문은 해당 이름에도 적용됩니다.

또는 다른 문서에서 CreateFile 자체 :

CreateFile 함수는 직렬 포트 COM1으로 통신에 자원, 핸들을 생성 할 수있다.통신 자원의 경우 dwCreationDisposition 매개 변수는 OPEN_EXISTING이어야하며 dwShareMode 매개 변수는 0이어야합니다 (배타적 액세스). hTemplateFile 매개 변수는 NULL이어야합니다. 읽기, 쓰기 또는 읽기/쓰기 액세스를 지정할 수 있으며 핸들은 겹쳐진 I/O에 대해 열 수 있습니다.

COM 포트 번호를 9보다 크게 지정하려면 다음 구문을 사용하십시오. \\.\COM10. 이 구문은 에서 COM 포트 번호를 지정할 수있는 모든 포트 번호와 하드웨어에 적용됩니다.

+0

당신의 멋진. 누군가가 다른 말을하면 그들은 당신에게 거짓말을합니다. – CodeBlocks

+0

중복 답변을 쓰는 ​​것은 굉장하지 않습니다. ((David는 최고입니다.) –

+0

@Ben 내 검색으로는 SO 질문에 도달하지 못했습니다. 죄송합니다. –