15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Класс CSerialPort v1.03 - интерфейс обмена данными с последовательным портом.

Автор: PJ Naughter

Скачать исходник - 18 Kb

Добро пожаловать в  MFC класс CSerialPort, который позволяет осуществлять любые операции с последовательным портом. В Классе имеется довольно большой набор функций.

Расширенные возможности

  • Поддерживается система исключений C++.
  • Поддержка Unicode.
  • Поддержка overlapped, blocking и callback моделей последовательных портов. (Callback поддерживается только в NT).

Использование

  • Чтобы использовать класс в своём коде, включите файл serialport.cpp в Ваш проект, и соответственно добавьте строчку #include serialport.h в соответствующих модулях, в которых требуется вызовы данного класса.
  • Пример использования класса содержится в файле "app.cpp".

Краткий пример использования класса:

try {
    CSerialPort port;
    port.Open(1, 1200, CSerialPort::NoParity, 8, CSerialPort::OneStopBit, CSerialPort::XonXoffFlowControl);

    char sBuf[] = "This should appear on the serial port";
    port.Write(sBuf, strlen(sBuf));

    port.Flush();

    port.Close();
}
catch (CSerialException* pEx)
{
    TRACE(_T("Handle Exception, Message:%s\n"), pEx->GetErrorMessage());
    pEx->Delete();
}

Функции, содержащиеся в классе

CSerialException::CSerialException
CSerialException::GetErrorMessage
CSerialException::m_dwError
CSerialPort::CSerialPort
CSerialPort::~CSerialPort
CSerialPort::Open
CSerialPort::Close
CSerialPort::Attach
CSerialPort::Detach
CSerialPort::operator HANDLE()
CSerialPort::IsOpen
CSerialPort::Dump
CSerialPort::Read
CSerialPort::ReadEx
CSerialPort::Write
CSerialPort::WriteEx
CSerialPort::TransmitChar
CSerialPort::GetOverlappedResult
CSerialPort::CancelIo
CSerialPort::GetConfig
CSerialPort::GetDefaultConfig
CSerialPort::SetConfig
CSerialPort::SetDefaultConfig
CSerialPort::ClearBreak
CSerialPort::SetBreak
CSerialPort::ClearError
CSerialPort::GetStatus
CSerialPort::GetState
CSerialPort::SetState
CSerialPort::Escape
CSerialPort::ClearDTR
CSerialPort::ClearRTS
CSerialPort::SetDTR
CSerialPort::SetRTS
CSerialPort::SetXOFF
CSerialPort::SetXON
CSerialPort::GetProperties
CSerialPort::GetModemStatus
CSerialPort::SetTimeouts
CSerialPort::GetTimeouts
CSerialPort::Set0Timeout
CSerialPort::Set0WriteTimeout
CSerialPort::Set0ReadTimeout
CSerialPort::SetMask
CSerialPort::GetMask
CSerialPort::WaitEvent
CSerialPort::Flush
CSerialPort::Purge
CSerialPort::TerminateOutstandingWrites
CSerialPort::TerminateOutstandingReads
CSerialPort::ClearWriteBuffer
CSerialPort::ClearReadBuffer
CSerialPort::Setup
CSerialPort::OnCompletion

 

 

CSerialException::CSerialException

CSerialException( DWORD dwError = 0);

Parameters

dwError   Ошибка, которая вызвада исключение.

Remarks

Данная функция вызывается, если создан объект CSerialException. To throw a CSerialException, call the global function AfxThrowSerialException. If you call if using the default value for dwError, then internally it will call GetLastError for you.

 

CSerialException::GetErrorMessage

virtual BOOL GetErrorMessage( LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL );
CString GetErrorMessage();

Return Value

1) Ненулевое, если функция выполнилась успешно; иначе 0, если текстовое сообщение не доступно.

2) CString представление ошибки

Parameters

lpszError   указатель на буфер, который будет содержать сообщение об ошибке.

nMaxError   The maximum number of characters the buffer can hold, including the NULL terminator.

pnHelpContext   The address of a UINT that will receive the help context ID. If NULL, no ID will be returned.

Remarks

Call this member function to provide text about an error that has occurred.

 

CSerialException::m_dwError

Remarks

The error that caused the exception. This error value is a system error code as found in WINERROR.H.

For a list of Win32 error codes, see Error Codes in the Win32 SDK.

 

 

CSerialPort::CSerialPort

CSerialPort();

Remarks

Стандартный конструктор класса. Устанавливает переменные класса в значения по умолчанию.

 

CSerialPort::~CSerialPort

~CSerialPort();

Remarks

Стандартный деструктор класса. Закрывает порт, если он был открыт.

 

CSerialException::Open

void Open( int nPort, DWORD dwBaud = 9600, Parity parity = NoParity, BYTE DataBits = 8, StopBits stopbits = OneStopBit, FlowControl fc = NoFlowControl, BOOL bOverlapped = FALSE);
   throw( CSerialException );

Parameters

nPort   Номер порт, который будет открыт.

dwBaud Скорость порта в бодах

parity Контроль чётности. Может принимать следующие значения:

enum Parity
{
EvenParity,
MarkParity,
NoParity,
OddParity,
SpaceParity
};

Databits Количество бит данных

stopbits Количество стоповых бит. Может принимать следующие значения:

enum StopBits
{
OneStopBit,
OnePointFiveStopBits,
TwoStopBits
};

fc Метод использующийся для контроля потока данных. Может принимать след. значения:

enum FlowControl
{
NoFlowControl,
CtsRtsFlowControl,
CtsDtrFlowControl,
DsrRtsFlowControl,
DsrDtrFlowControl,
XonXoffFlowControl
};

bOverlapped TRUE если Вы хотите открыть в режиме overlapped, иначе FALSE для использования блокирующих вызовов.

Remarks

Функция открывает коммуникационный порт. Внутри класса, для открытия порта, будет использоваться функция CreateFile , а затем SetState для установления различных установок RS-232 . При возникновении ошибки, сработает CSerialException

 

CSerialPort::Close

Close();

Remarks

Закрывает уже открытый коммуникационный порт.

 

CSerialPort::Attach

void Attach(HANDLE hComm);

Parameters

hComm   SDK обработчик открытого порта.

Remarks

Позволяет приаттачить экземпляр CSerialPort к существующему обработчику коммуникационного порта. Данная функция работает подобно CWnd::Attach в   MFC.

 

CSerialPort::Detach

HANDLE Detach();

Return Value

HANDLE порта.

Remarks

Делает обратное действие предыдущей функции Attach. Соответственно работает аналогично MFC функции CWnd::Detach.

 

CSerialPort::operator HANDLE

operator HANDLE();

Return Value

HANDLE порта.

Remarks

Позволяет получить обработчик порта. Можно использовать это хэндл для вызова Windows API напрямую

 

CSerialPort::IsOpen

BOOL IsOpen() const

Return Value

TRUE если порт открыт, иначе FALSE

 

CSerialPort::Dump

void Dump(CDumpContext& dc) const

Remarks

Стандартная функция MFC для диагностики

 

CSerialPort::Read \ ReadEx

DWORD Read(void* lpBuf, DWORD dwCount);
BOOL Read(void*
lpBuf, DWORD dwCount, OVERLAPPED& overlapped);
void ReadEx(void*
lpBuf, DWORD dwCount);
   throw( CSerialException );

Return Value

1) Количество прочитанных байт.

2) TRUE если overlapped чтение завершилось синхронно, FALSE если операция завершилась асинхронно.

Parameters

lpBuf  Указатель на буфер, куда будут считаны данные из последовательного порта

dwCount  Указывает количество байт, которые надо считать из последовательного порта.

overlapped  ссылка на структуру OVERLAPPED. Необходимо, если порт был открыт в режиме overlapped.

Remarks

Эти 3 функции являются надстройками над SDK вызовами ReadFile и ReadFileEx. Вторая версия функции Read для режима overlapped.

 

CSerialPort::Write \ WriteEx

DWORD Write(const void* lpBuf, DWORD dwCount);
BOOL Write(const void*
lpBuf, DWORD dwCount, OVERLAPPED& overlapped);
void WriteEx(const void*
lpBuf, DWORD dwCount);
   throw( CSerialException );

Return Value

1) Количество записанных байт.

2) TRUE если overlapped запись завершилась синхронно, FALSE если операция завершилась асинхронно.

Parameters

lpBuf  Указатель на буфер, содержащий данные для записи в последовательный порт

dwCount  Указывает количество байт, которые надо записать в последовательный порт.

overlapped  ссылка на структуру OVERLAPPED. Необходимо, если порт был открыт в режиме overlapped.

Remarks

Эти 3 функции являются надстройками над SDK вызовами WriteFile и WriteFileEx. Вторая версия функции Write для режима overlapped.

 

CSerialPort::TransmitChar

void TransmitChar(char cChar) const
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции TransmitCommChar. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::GetOverlappedResult

void GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetOverlappedResult. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::CancelIo

void CancelIo()
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции CancelIo. Смотрите Win32 SDK для подробной информации. Данная функция доступна только в NT 4 или Windows 98 или выше.

 

CSerialPort::GetConfig

void GetConfig(COMMCONFIG& config)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetCommConfig. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::GetDefaultConfig

static void GetDefaultConfig(int nPort, COMMCONFIG& config)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetDefaultCommConfig. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::SetConfig

void SetConfig(COMMCONFIG& config)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции SetCommConfig. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::SetDefaultConfig

static void SetDefaultConfig(int nPort, COMMCONFIG& config)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции SetDefaultCommConfig. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::ClearBreak

void ClearBreak()
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции ClearCommBreak. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::SetBreak

void SetBreak()
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции SetCommBreak. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::ClearError

void ClearError(DWORD& dwErrors)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции ClearCommError. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::GetStatus

void GetStatus(COMMSTAT& stat)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetCommStatus. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::GetState

void GetState(DCB& dcb)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetCommState. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::SetState

void SetState(DCB& dcb)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции SetCommState. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::Escape

void Escape(DWORD dwFunc)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции EscapeCommFunction. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::ClearDTR

void ClearDTR()
   throw( CSerialException );

Remarks

Calls the Escape function using the constant CLRDTR which lowers the DTR line.

 

CSerialPort::ClearRTS

void ClearRTS()
   throw( CSerialException );

Remarks

Calls the Escape function using the constant CLRRTS which lowers the RTS line.

 

CSerialPort::SetDTR

void SetDTR()
   throw( CSerialException );

Remarks

Calls the Escape function using the constant SETDTR which raises the DTR line.

 

CSerialPort::SetRTS

void SetRTS()
   throw( CSerialException );

Remarks

Calls the Escape function using the constant SETRTS which raises the RTS line.

 

CSerialPort::SetXOFF

void SetXOFF()
   throw( CSerialException );

Remarks

Calls the Escape function using the constant SETXOFF which causes transmission to act as if an XOFF character has been received..

 

CSerialPort::SetXON

void SetXON()
   throw( CSerialException );

Remarks

Calls the Escape function using the constant SETXON which causes transmission to act as if an XON character has been received..

 

CSerialPort::GetProperties

void GetProperties(COMMPROP& properties)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetCommProperties. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::GetModemStatus

void GetModemStatus(DWORD& dwModemStatus)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetCommModemStatus. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::SetTimeouts

void SetTimeouts(COMMTIMEOUTS& timeouts)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции SetCommTimeouts. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::GetTimeouts

void GetTimeouts(COMMTIMEOUTS& timeouts)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetCommTimeouts. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::Set0Timeout

void Set0Timeout()
   throw( CSerialException );

Remarks

Устанавливает тайм аут посылки с приёма в 0. This cause writes to return immediately and for reads to return with whatever data is waiting in the receive buffer rather than wait for the specified amount of bytes to arrive.

 

CSerialPort::Set0WriteTimeout

void Set0WriteTimeout()
   throw( CSerialException );

Remarks

Устанавливает передающий тайм аут в 0.

 

CSerialPort::Set0ReadTimeout

void Set0ReadTimeout()
   throw( CSerialException );

Remarks

Устанавливает тайм аут считывания в 0. This cause reads to return with whatever data is waiting in the receive buffer rather than wait for the specified amount of bytes to arrive.

 

CSerialPort::SetMask

void SetMask(DWORD dwMask)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции SetCommMask. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::GetMask

void GetMask(DWORD& dwMask)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции GetCommMask. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::WaitEvent

void WaitEvent(DWORD& dwMask)
void WaitEvent(DWORD&
dwMask, OVERLAPPED& overlapped)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции WaitCommEvent. Вторая WaitEvent это overlapped версия. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::Flush

void Flush()
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции FlushFileBuffers. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::Purge

void Purge(DWORD dwFlags)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции PurgeComm. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::TerminateOutstandingWrites

void TerminateOutstandingWrites()
   throw( CSerialException );

Remarks

Calls the Purge function using the constant PURGE_TXABORT which terminates all outstanding write operations and returns immediately, even if the write operations have not been completed.

 

CSerialPort::TerminateOutstandingReads

void TerminateOutstandingReads()
   throw( CSerialException );

Remarks

Calls the Purge function using the constant PURGE_RXABORT which terminates all outstanding read operations and returns immediately, even if the read operations have not been completed.

 

CSerialPort::ClearWriteBuffer

void ClearWriteBuffer()
   throw( CSerialException );

Remarks

Очищает выходной буфер, используя константу PURGE_TXCLEAR..

 

CSerialPort::ClearReadBuffer

void ClearReadBuffer()
   throw( CSerialException );

Remarks

Очищает входной буфер, используя константу PURGE_RXCLEAR..

 

CSerialPort::Setup

void Setup(DWORD dwInQueue, DWORD dwOutQueue)
   throw( CSerialException );

Remarks

Простая надстройка для SDK функции SetupComm. Смотрите Win32 SDK для подробной информации.

 

CSerialPort::OnCompletion

virtual void OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped);
   throw( CSerialException );

Parameters

dwErrorCode  

Specifies the I/O completion status. This parameter may be one of the following values:

Value Meaning
0 I/O завершился успешно.
ERROR_HANDLE_EOF The ReadFileEx function tried to read past the end of the file.

dwCount Указывает на количество переданных байт. Если ошибка, то этот параметр - ноль

lpOverlapped Указательна на структуру OVERLAPPED , определённую для ассинхронных I/O функций.

Remarks

Данная функция вызывается, как процедура завершения для различных ассинхронных вызовов в WriteEx или ReadEx. В Вашем наследованном от CSerialPort классе, Вы можете определить собственную функцию для реакции на ассинхронные вызовы.