As work with the ports in Windows is carried out in the same way as work with files, reading from and writing into the port are carried out with the help of ReadFile and WriteFile functions correspondingly.
ReadFile function is used to read the information from the port
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
BOOL WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped);
hFile — descriptor of the open communication port file;
lpBuffer — buffer address. In case of Write operation the data from this buffer will be transmitted to the port. In case of Read operation the data received from the line will be placed into this buffer;
nNumOfBytesToRead, nNumOfBytesToWrite — number of bytes to be received or or intended for transmission;
nNumOfBytesRead, nNumOfBytesWritten — number of actually received or transmitted bytes. If the number of received or transmitted bytes is lower than requested it's an error for a disc file but not necessarily for a communication port. The cause is to be found in timeouts.
LpOverlapped — the address of OVERLAPPED structure used for asynchronous operations.
In case of abnormal temination the functions return NULL, in case of normal termination - any other value.
Example of read-write operation:
DWORD numbytes, numbytes_ok, temp;
char buf_in = "Hello!";
numbytes = 6;
ClearCommError(handle, &temp, &ComState); // if temp is not null, the port is in the error state
if (!temp) WriteFile(handle, buf_in, numbytes, &numbytes_ok, &Overlap);
ClearCommError(handle, &temp, &ComState);
if(!temp) ReadFile(handle, buf_in, numbytes, &numbytes_ok, &Overlap); // the numbytes_ok variable contains the actual number of I/O bytes
This example uses two structures COMSTAT and OVERLAPPED which we haven't yet discussed, and also ClearCommError function. In case of “three wires” connection we needn't consider OVERLAPPED structure (just use it as shown in the example).
© fCoder SIA