Автор работы: Пользователь скрыл имя, 01 Ноября 2010 в 14:15, Не определен
В настоящее время существует множество устройств, которые обмениваются с компьютером информацией через последовательный порт (COM1, COM2) по протоколу RS-232. Причем такие устройства разрабатывают до сих пор и, я уверен, будут разрабатывать и в дальнейшем. Ведь несмотря на недостатки такой связи: медленная скорость обмена информацией, ограничение на длину соединительных линий — существует и немало достоинств: программная поддержка протокола RS-232 и ему подобных многими периферийными устройствами, специализированными микросхемами, низкая стоимость, минимальное количество соединительных проводов, простота.
BOOL PurgeComm(
HANDLE hFile,
DWORD dwFlags
);
Эта функция может выполнять две задачи: очищать очереди приема-передачи в драйвере или же завершать все операции ввода-вывода. Какие именно действия выполнять, задается другим параметром:
PURGE_TXABORT — немедленно
прекращает все операции
PURGE_RXABORT — немедленно
прекращает все операции
PURGE_TXCLEAR — очищает очередь передачи в драйвере;
PURGE_RXCLEAR — очищает очередь приема в драйвере.
Эти значения можно
комбинировать с помощью
Настало время
для рассмотрения непосредственно
операций чтения-записи для порта. Как
и для работы с файлами, используются
функции 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 содержится реальное число переданных-
// принятых байт
В этом примере
мы использовали две неизвестные
нам ранее структуры 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;
Нам могут пригодиться два поля этой структуры:
CbInQue — число символов в приемном буфере. Эти символы приняты из линии, но еще не считаны функцией ReadFile;
CbOutQue — число
символов в передающем буфере.
Эти символы еще не переданы
в линию.
Остальные поля
данной структуры содержат информацию
об ошибках.
И наконец, после
завершения работы с портом его следует
закрыть. Закрытие объекта в Win32 выполняет
функция CloseHandle:
BOOL CloseHandle(
HANDLE hObject
};
На нашем сайте
вы можете найти полный текст класса для
работы с последовательным портом в асинхронном
режиме “по трем проводам”, а также пример
программы с использованием этого класса.
Все это написано под Builder С++, но, поскольку
используются только функции API Win32, текст
программы легко изменить под любой компилятор
С++. Возможно также, что класс написан
не совсем “по правилам” — прошу извинить,
автор не является “правильным” программистом
и пишет так, как ему удобно J .
Если у вас возникли вопросы по поводу использования функций, рассмотренных выше, вы всегда сможете обратиться к справочной информации по Win32. А если возникнет необходимость более полно использовать последовательные порты (например, использовать различные управляющие сигналы) прочтите статью Олега Титова “Работа с коммуникационными портами (COM и LPT) в программах для Win32”.
Информация о работе Программирование последовательных портов