2014-03-03 2 views
1

필자는 직렬 포트에서 읽고 쓰는 코드 (멀티 스레드 코드)를 여러 가지 소스로 작성했습니다. 그것은 잘 작동합니다 ... 직렬 포트에서 읽기를 수행하는 쓰레드의 루프가 의도하지 않게 대기 중이다. 기본적으로 반복되는 것은 다음과 같습니다.비동기 직렬 통신 : 왜 ReadFile()은 OVERLAPPED 구조체에 이벤트를 설정합니까?

  • 이벤트 (읽기 루프 외부에서 생성 됨)가 재설정되고 해당 핸들이 OVERLAPPED 구조체의 hEvent 멤버로 사용됩니다.
  • 에서 ReadFile() (다른 매개 변수들)을 OVERLAPPED 구조체를 전달하고 즉시 반환
  • 의 WaitForSingleObject()는 OVERLAPPED 구조체의 이벤트에 대기하지만, 항상 이벤트가 항상 ReadFile을 한 후 설정 때문에 즉시 반환()
  • GetOverlappedResult()는 같은 OVERLAPPED 구조체가 성공적으로 반환 통과하지만, 일반적으로 만 0 바이트

내 기대가 이벤트의 전체 포인트가 읽을 수있는 데이터가있을 때 신호를이었다이었다 읽고 다음있다. 그러나 ReadFile()은 이벤트를 설정하기 때문에 그 요점은 무엇입니까? 내가 뭘 놓치고 있니?

다음 스트립 - 백 코드는 내 시스템 (COM3이 연결되어 있음)의 문제점을 보여줍니다. 전체 코드는 아주 행복하게 읽기 및 쓰기 ...하지만 독자는 위에서 설명한 조건을 앓고 :

HANDLE portHandle = CreateFile("COM3", 
           GENERIC_READ | GENERIC_WRITE, 
           0, 
           NULL, 
           OPEN_EXISTING, 
           FILE_FLAG_OVERLAPPED, 
           NULL); // succeeds 
HANDLE readerEvent = CreateEvent(0, TRUE, FALSE, _T("Rx Event")); // succeeds 
char buffer[ 200 ]; 
DWORD bytesRead; 
OVERLAPPED reader; 
memset(&reader, 0, sizeof(reader)); 
reader.hEvent = readerEvent; 
ResetEvent(readerEvent); 
ReadFile(portHandle, buffer, 200, &bytesRead, &reader); 
if (WaitForSingleObject(reader.hEvent, 2000) == WAIT_OBJECT_0) 
{ 
    // always true, never has to wait on the event. 
} 
+0

일부 코드를 표시하십시오. –

+0

이벤트를 수동으로 재설정 할 필요가 없습니다. 'ReadFile'은 당신을 위해 그것을합니다. [MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx) :'ReadFile은 이벤트가 시작될 때 비 신호 상태로 재설정합니다 I/O 작업. " –

답변

2

가 발견 :

  • 것은 읽는 다음 ReadFile을 기능에 대한 설명서를이 단락을 포함 통신 장치의 경우 ReadFile의 동작은 SetCommTimeouts 및 GetCommTimeouts 함수를 사용하여 설정되고 검색된 현재 통신 시간 제한에 의해 결정됩니다. 시간 초과 값을 설정하지 않으면 예기치 않은 결과가 발생할 수 있습니다. 통신 시간 초과에 대한 자세한 내용은 COMMTIMEOUT을 참조하십시오.

저는 SetCommTimeouts()를 전혀 사용하지 않았습니다.

  • ReadTotalTimeoutConstant 및 ReadTotalTimeoutMultiplier 부재 모두 0 값과 결합 MAXDWORD의 값이,하도록 지정 (a GetCommTimeouts 수행)과 검사 결과는 포트의 설정이 COMMTIMEOUTS 문서에서, 본 단락에서 설명 된 값이었다 나타났다 읽기 조작은 바이트가 수신되지 않은 경우에도 이미 수신 된 바이트로 즉시 리턴하는 것입니다.
0

WaitCommEvent 기능을 사용하여 특정 이벤트 마스크로 이벤트를 대기 할 수도 있습니다. CreateFile 및 WaitCommEvent를 사용하는 코드 샘플 : Monitoring Communications Events.

+0

감사합니다 - 그 기능을 인식하지 못했습니다. – omatai