Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Bool setcommtimeouts( handle hfile, lpcommtimeouts lpcommtimeouts);

Поскольку операции передачи-приема ведутся на малой скорости, используется буферизация данных. Для задания размера буфера приема и передачи необходимо воспользоваться функцией:

BOOL SetupComm(
HANDLE hFile,
DWORD dwInQueue,
DWORD dwOutQueue
);

Допустим, вы обмениваетесь с внешним устройством пакетами информации размером 1024 байта, тогда разумным размером буферов будет значение 1200. Функция SetupComm интересна тем, что она может просто принять ваши размеры к сведению, внеся свои коррективы, либо вообще отвергнуть предложенные вами размеры буферов — в таком случае эта функция завершится ошибкой.

Пример открытия и конфигурирования последовательного порта COM1. В данном примере порт открывается для работы со скоростью 9 600 бит/c, используется 1 стоповый бит, бит четности не используется:

#include
..........
HANDLE handle;
COMMTIMEOUTS CommTimeOuts;
DCB dcb;
handle = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
SetupComm(handle, SizeBuffer, SizeBuffer);
GetCommState(handle, &dcb);


dcb.BaudRate = CBR_9600;
dcb.fBinary = TRUE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
dcb.fDsrSensitivity = FALSE;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = 1;
SetCommState(handle, &dcb);


CommTimeOuts.ReadIntervalTimeout= 10;
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
// значений этих тайм – аутов вполне хватает для уверенного приема
// даже на скорости 110 бод
CommTimeOuts.ReadTotalTimeoutConstant = 100;
// используется в данном случае как время ожидания посылки
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(handle, &CommTimeOuts);


PurgeComm(handle, PURGE_RXCLEAR);
PurgeComm(handle, PURGE_TXCLEAR);

После открытия порта первым делом необходимо сбросить его, так как в буферах приема и передачи может находиться “мусор”. Поэтому в конце примера применяем ранее не известную нам функцию PurgeComm:

BOOL PurgeComm(
HANDLE hFile,
DWORD dwFlags
);

Эта функция может выполнять две задачи: очищать очереди приема-передачи в драйвере или же завершать все операции ввода-вывода. Какие именно действия выполнять, задается другим параметром:

  • PURGE_TXABORT — немедленно прекращает все операции записи, даже если они не завершены;
  • PURGE_RXABORT — немедленно прекращает все операции чтения, даже если они не завершены;
  • PURGE_TXCLEAR — очищает очередь передачи в драйвере;
  • PURGE_RXCLEAR — очищает очередь приема в драйвере.
    Эти значения можно комбинировать с помощью побитовой операции OR. Очищать буферы рекомендуется также после ошибок приема-передачи и после завершения работы с портом.

Рассмотрим непосредственно операции чтения-записи для порта. Как и для работы с файлами, используются функции ReadFile и WriteFile:

BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumOfBytesToRead,
LPDWORD lpNumOfBytesRead,
LPOVERLAPPED lpOverlapped
);
BOOL WriteFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumOfBytesToWrite,
LPDWORD lpNumOfBytesWritten,
LPOVERLAPPED lpOverlapped
);

Рассмотрим назначение параметров этих функций:

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

Для нашего случая связи “по трем проводам” структуру 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;

 

Нам могут пригодиться два поля этой структуры:

  • CbInQue — число символов в приемном буфере. Эти символы приняты из линии, но еще не считаны функцией ReadFile;
  • CbOutQue — число символов в передающем буфере. Эти символы еще не переданы в линию.

Остальные поля данной структуры содержат информацию об ошибках.

И наконец, после завершения работы с портом его следует закрыть. Закрытие объекта в Win32 выполняет функция CloseHandle:

BOOL CloseHandle(
HANDLE hObject
};

 

<== предыдущая лекция | следующая лекция ==>
Bool getcommstate( handle hfile, lpdcb lpdcb ); | Стандарт 1394a
Поделиться с друзьями:


Дата добавления: 2013-12-14; Просмотров: 678; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.