Search code examples
c++portreadfile

Which ReadFile parameter in this code is incorrect? (Error code 87)


(Edit: I didn't exclude any code except the headers and the main() function's brackets. Nothing is written between lines of code listed here.)

.

I used the ReadFile function to read this COM3 port (which returned no INVALID_HANDLE_VALUE or ERROR_FILE_NOT_FOUND):

LPCTSTR portName = "COM3" ;

HANDLE hSerial;
hSerial = CreateFile(portName,
                     GENERIC_READ | GENERIC_WRITE,
                     0,    // exclusive access
                     NULL, // default security attributes
                     OPEN_EXISTING,
                     FILE_FLAG_OVERLAPPED,
                     NULL);

And the ReadFile function in question uses following parameters:

DWORD n = 512 ;
char szBuff[n] = {0};
DWORD dwBytesRead = 0;

if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL))
{
    cout << "ReadFile error. Error code: " << GetLastError() << endl ;
    cin.get() ;
    return 0 ;
}

What changes should I introduce to cause the read to succeed?

(I searched through the function's documentation and other StackOverflow questions, tested lots of things, but couldn't find an answer.)


Solution

  • In ReadFile documentation you can read:

    lpOverlapped [in, out, optional] A pointer to an OVERLAPPED structure is required if the hFile parameter was opened with FILE_FLAG_OVERLAPPED, otherwise it can be NULL.

    so since you specified FILE_FLAG_OVERLAPPED in CreateFile you should provide OVERLAPPED in ReadFile.

    In CreateFile you can read on parameters for Communications Resources:

    ... and the handle can be opened for overlapped I/O.

    so you can skip FILE_FLAG_OVERLAPPED in CreateFile