2009-04-21 5 views
2

Win32 API를 사용하여 stdin/stdout을 직렬 포트 (명령 행 터미널 에뮬레이터)에 매핑하는 작은 유틸리티를 작성하려고합니다. 내가 일을한다고 생각하는 다음 코드를 가지고 있지만 직렬 포트에서 제대로 알림을 수신 할 나타나지 않습니다Win32에서 통신 포트와 stdin을 듣기

HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
HANDLE hCom = CreateFile(com_name, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, 0, NULL); 

/* check for errors opening the serial port, configure, set timeouts, etc */ 

HANDLE hWaitHandles[2]; 
hWaitHandles[0] = hStdin; 
hWaitHandles[1] = hCom; 
DWORD dwWaitResult = 0; 
for (;;) { 
    dwWaitResult = WaitForMultipleObjects(2, hWaitHandles, FALSE, INFINITE); 
    if(dwWaitResult == WAIT_OBJECT_0) 
    { 
     DWORD bytesWritten; 
     int c = _getch(); 
     WriteFile(hCom, &c, 1, &bytesWritten, NULL); 
     FlushConsoleInputBuffer(hStdin); 
    } else if (dwWaitResult == WAIT_OBJECT_0+1) { 
     char byte; 
     ReadFile(hCom, &byte, 1, &bytesRead, NULL); 
     if (bytesRead) 
      printf("%c",byte); 
    } 
} 

모든 아이디어는 내가 잘못 여기서 뭘하는지?

답변

1

올바르게 기억한다면 모든 것이 제대로 작동하려면 겹친 I/O를 사용하여 직렬 포트 액세스를 수행해야합니다. 이것은 일반적으로 직렬 포트 입력을 처리하기 위해 별도의 스레드를 만들어야 함을 의미합니다. 정확히 기억하지 못 하겠지만 WaitForMultipleObjects을 사용하면 직렬 포트에 문제가 있습니다.

+0

hrmm. 나는 그것을 피하려고 노력했다. (겉보기에?) 간단한 작업에 약간의 잔인한 행동처럼 보입니다. – Mikeage

1

WaitForMultiplObjects에 대한 문서는 다음이 때 Waitable 것을 말한다 : 파일과 COMMS 포트가 언급되지 않은 것을

* Change notification 
* Console input 
* Event 
* Memory resource notification 
* Mutex 
* Process 
* Semaphore 
* Thread 
* Waitable timer 

알 수 있습니다.

+0

예; 나는 그것을 나중에 깨달았다. 나는 여전히 posix의 select()를 생각하고있다. 기술적으로 WaitForMultipleObjects는 포트 자체가 아니라 ReadFile() 또는 WriteFile()에 전달 된 중첩 된 이벤트에 대해 수행됩니다. – Mikeage