2013-02-26 39 views
2

您好,我有一個關於通訊端口異步讀取的問題。C如何使用異步讀取文件

我有一個函數,它應該從通信端口讀取一個字節異步。這個函數每10ms調用一次。我試圖做到同步,但一個緩衝區溢出,因爲該函數被稱爲更快,比它可以完成。 現在我想實現它異步。但不明白它是如何工作的。

我的函數調用(被稱爲每隔10毫秒):

// read one byte into receiveChar 
bytesReceived = BSP_cliGetChar(&receiveChar); 

函數體

int BSP_cliGetChar(char *rxBuffer) 
{ 
DWORD numOfBytesRead; 
OVERLAPPED readOverlapped; 
HANDLE hEvent; 
BOOL fOverlapped; 
char str[255]; 

hEvent = CreateEvent(NULL, // default security attribute 
        TRUE, // manual-reset event 
        TRUE, // initial state = signaled 
        NULL); // unnamed event object 

// set up overlapped structure fields 
readOverlapped.Offset  = 0; 
readOverlapped.OffsetHigh = 0; 
readOverlapped.hEvent  = hEvent; 

if (!ReadFile(hComm, rxBuffer, 1, &numOfBytesRead, &readOverlapped)) 
{ 
    if (GetLastError() != ERROR_IO_PENDING) 
    { 
    // Some other error occurred while reading the file. 
    ExitProcess(0); 
    } 
    else 
    fOverlapped = TRUE; 
} 
else 
{ 
    // Operation has completed immediately. 
    fOverlapped = FALSE; 
    return (int) numOfBytesRead; 
} 
while(!HasOverlappedIoCompleted(&readOverlapped)) 
{ 
    sprintf_s(str, "%d", &numOfBytesRead); 
    OutputDebugString(str); 
} 

}

現在,我想要的是讀取COM端口一個字節。如果返回ERROR_IO_PENDING,則調用函數應該繼續。只有收到一個字節時,BSP_cliGetChar函數纔會返回。問題是,該方法停留在while循環中,而不是繼續調用過程。

任何人有想法如何解決這個問題?

謝謝你的幫助。

回答

1

我把你的代碼,並具有以下主要功能

BSP_cliGetChar(char *rxBuffer); 

HANDLE hComm; 

int main() { 
    char buf; 
    DWORD numRead; 

    hComm = CreateFile(
     "COM2", 
     GENERIC_READ | GENERIC_WRITE, 
     0, 
     NULL, 
     OPEN_EXISTING, 
     FILE_FLAG_OVERLAPPED, 
     NULL); 
    if (hComm == INVALID_HANDLE_VALUE) 
    { 
     printf("error createfile: %d\n", GetLastError()); 
     return 1; 
    } 

    do 
    { 
     BSP_cliGetChar(&buf); 
     printf("%c", buf); 
    } while (buf != 'X'); 

    CloseHandle(hComm); 
    return 0; 
} 

我以前Virtual Serial Port Driver創建鏈接對COM端口COM1和COM2的把它丟到一個項目。我用PuTTY打開COM1,然後運行我的程序。正如所料,我坐在HasOverlappedIoCompleted循環中。只要我通過PuTTY發送了一個字符,這個循環就退出了,我的字符被打印出來了。

這就是說我不知道​​你的環境,它可能與你的實際硬件有關,並在代碼中正確配置你的COM端口。 MSDN有很好的配置你的串行通信的信息,特別注意到Device Control Block (DCB) Structure

希望有幫助。也許你可以爲你的場景提供更多的細節。