2008-11-01 7 views
2

이벤트/인터럽트를 사용하여 직렬에서 읽고 쓰고 싶습니다. 현재는 while 루프에서 사용하고 있으며 연속적으로 직렬을 통해 읽고 씁니다. 직렬 포트에서 무엇인가를 읽을 때만 읽기를 원합니다. 이 C++에서 어떻게 구현합니까?직렬 통신의 이벤트/인터럽트

이 내 현재 코드입니다 : 당신은 단지 당신이 포트에 데이터가 알고 읽을 필요가 있도록

 
    while(true) 
    { 
     //read 
     if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){ 
     //error occurred. Report to user. 
     } 

     //write 
     if(!WriteFile(hSerial, szBuff, n, &dwBytesRead, NULL)){ 
     //error occurred. Report to user. 
     } 


     //print what you are reading 
     printf("%s\n", szBuff); 

    } 

답변

0

가 읽기를 확인하고 차단하지 않고 버퍼를 작성하고 자신의 상태를 반환하는 select 문을 사용하여 , 또는 출력 버퍼에 공간이 있음을 알 때 쓸 수 있습니다.

http://www.developerweb.net/forum/showthread.php?t=2933의 세 번째 예와 관련된 설명이 도움이 될 수 있습니다.

편집 : select의 맨 페이지에는 끝 부분에 더 간단하고 완전한 예가 있습니다. 귀하의 시스템에서 man 2 select이 작동하지 않으면 http://linux.die.net/man/2/select에서 찾을 수 있습니다.

참고 : 마스터하기 select()을 사용하면 직렬 포트와 소켓 모두에서 작업 할 수 있습니다. 그것은 많은 네트워크 클라이언트와 서버의 핵심입니다.

+0

내가 선택 문장의 예를 볼 수 대기 중단 시간 동안 경과 된 시간을 볼 수 있습니다 창에 중단을 사용하여 시리얼 incomming 데이터를 읽는 코드 또는 예제에 대한 링크? 나는 google에 그것을 찾아 낼 수 없었다. – Steve

+0

나는 두 개를 가로 질러왔다. 맨 페이지가 더 명확하고 간결해진 것을 발견했습니다. developerweb 링크는 소켓 지향적이지만 좀 더 도움이되는 Q & A가 있습니다. –

+0

select()는 POSIX 파일 디스크립터 (정수)에서만 작동하며 Windows HANDLE에서는 작동하지 않습니다. –

0

Windows 환경의 경우보다 고유 한 방법은 asynchronous I/O을 사용하는 것입니다. 이 모드에서는 여전히 ReadFile 및 WriteFile에 대한 호출을 사용하지만 작업이 완료 될 때 호출 될 콜백 함수를 전달하는 것을 차단하는 대신 호출을 사용합니다.

모든 세부 사항을 올바르게 파악하는 것은 상당히 까다 롭습니다.

+0

비동기 직렬 I/O의 문제는 처음 읽는 바이트가 데이터 읽기 이벤트를 트리거한다는 것입니다. 그런 다음 새 데이터를 가져올 때 어떻게 든 알아 내야 만합니다. 나는 좋은 대답 인 것처럼 보이지 않기 때문에 그것에 대해 질문 할 것이라고 생각한다. – Coderer

+0

우리는 일반적으로 (1) 버퍼가 비어있을 때까지 읽는다. * 버퍼가 있다고 가정하거나, (2) 적절한 시간 초과가 발생할 때까지 읽기 루프에 남아 있습니다. "적절하다"는 독자의 연습 문제로 남아있다. :-) –

0

다음은 몇 년 전에 c/C++ 사용자 저널에 게시 된 article의 복사본입니다. Win32 API에 대해 자세히 설명합니다. 여기

0

사용하면

int pollComport(int comport_number, LPBYTE buffer, int size) { BYTE Byte; DWORD dwBytesTransferred; DWORD dwCommModemStatus; int n; double TimeA,TimeB; // Specify a set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR); while (m_comPortHandle[comport_number] != INVALID_HANDLE_VALUE) { // Wait for an event to occur for the port. TimeA = clock(); WaitCommEvent (m_comPortHandle[comport_number], &dwCommModemStatus, 0); TimeB = clock(); if(TimeB-TimeA>0) cout <<" ok "<<TimeB-TimeA<<endl; // Re-specify the set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR); if (dwCommModemStatus & EV_RXCHAR) { // Loop for waiting for the data. do { ReadFile(m_comPortHandle[comport_number], buffer, size, (LPDWORD)((void *)&n), NULL); // Display the data read. if (n>0) cout << buffer <<endl; } while (n > 0); } return(0); } }