Для операции записи данные из
Для операции записи данные из этого буфера будут передаваться в порт. Для операции чтения в этот буфер будут помещаться принятые из линии данные;
nNumOfBytesToRead, nNumOfBytesToWrite — число ожидаемых к приему или предназначенных для передачи байт; nNumOfBytesRead, nNumOfBytesWritten — число фактически принятых или переданных байт. Если принято или передано меньше данных, чем запрошено, то для дискового файла это свидетельствует об ошибке, а для коммуникационного порта — совсем не обязательно. Причина в тайм-аутах. LpOverlapped — адрес структуры OVERLAPPED, используемой для асинхронных операций.
В случае нормального завершения функции возвращают значение, отличное от нуля, в случае ошибки — нуль.
Приведу пример операции чтения и записи:
#include …………..DWORD numbytes, numbytes_ok, temp;COMSTAT ComState;OVERLAPPED Overlap;char buf_in[6] = "Hello!";numbytes = 6;ClearCommError(handle, &temp, &ComState);// если temp не равно нулю, значит порт в состоянии ошибкиif(!temp) WriteFile(handle, buf_in, numbytes, &numbytes_ok, &Overlap);ClearCommError(handle, &temp, &ComState);if(!temp) ReadFile(handle, buf_in, numbytes, &numbytes_ok, &Overlap);// в переменной numbytes_ok содержится реальное число переданных-// принятых байт В этом примере мы использовали две неизвестные нам ранее структуры COMSTAT и OVERLAPPED, а также функцию ClearCommError. Для нашего случая связи “по трем проводам” структуру OVERLAPPED можно не рассматривать (просто использовать, как в примере). Прототип функции ClearCommError имеет вид:
BOOL ClearCommError(
HANDLE hFile,
LPDWORD lpErrors,
LPCOMSTAT lpStat
); Эта функция сбрасывает признак ошибки порта (если таковая имела место) и возвращает информацию о состоянии порта в структуре COMSTAT:
typedef struct _COMSTAT
DWORD fCtsHold:1;
DWORD fDsrHold:1;
DWORD fRlsdHold:1;
DWORD fXoffHold:1;
DWORD fXoffSent:1;
DWORD fEof:1;
DWORD fTxim:1;
DWORD fReserved:25;
DWORD cbInQue;
DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;
Содержание Назад Вперед