Программирование последовательных портов

Автор работы: Пользователь скрыл имя, 01 Ноября 2010 в 14:15, Не определен

Описание работы

В настоящее время существует множество устройств, которые обмениваются с компьютером информацией через последовательный порт (COM1, COM2) по протоколу RS-232. Причем такие устройства разрабатывают до сих пор и, я уверен, будут разрабатывать и в дальнейшем. Ведь несмотря на недостатки такой связи: медленная скорость обмена информацией, ограничение на длину соединительных линий — существует и немало достоинств: программная поддержка протокола RS-232 и ему подобных многими периферийными устройствами, специализированными микросхемами, низкая стоимость, минимальное количество соединительных проводов, простота.

Файлы: 1 файл

Программирование последовательных портов.doc

— 61.50 Кб (Скачать файл)

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 содержится реальное число переданных-

// принятых байт 

В этом примере  мы использовали две неизвестные  нам ранее структуры 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”.

Информация о работе Программирование последовательных портов