Порты - статьи


         

Для операции записи данные из


Для операции записи данные из этого буфера будут передаваться в порт. Для операции чтения в этот буфер будут помещаться принятые из линии данные;
  • 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;



    Содержание  Назад  Вперед