#ifndef __SERIALPORT_H__
|
#define __SERIALPORT_H__
|
|
#define WM_COMM_BREAK_DETECTED WM_USER+1 // A break was detected on input.
|
#define WM_COMM_CTS_DETECTED WM_USER+2 // The CTS (clear-to-send) signal changed state.
|
#define WM_COMM_DSR_DETECTED WM_USER+3 // The DSR (data-set-ready) signal changed state.
|
#define WM_COMM_ERR_DETECTED WM_USER+4 // A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
|
#define WM_COMM_RING_DETECTED WM_USER+5 // A ring indicator was detected.
|
#define WM_COMM_RLSD_DETECTED WM_USER+6 // The RLSD (receive-line-signal-detect) signal changed state.
|
#define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.
|
#define WM_COMM_RXFLAG_DETECTED WM_USER+8 // The event character was received and placed in the input buffer.
|
#define WM_COMM_TXEMPTY_DETECTED WM_USER+9 // The last character in the output buffer was sent.
|
|
class CSerialPort
|
{
|
public:
|
// contruction and destruction
|
CSerialPort();
|
virtual ~CSerialPort();
|
|
// port initialisation
|
BOOL InitPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 19200, char parity = 'N', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_CTS, UINT nBufferSize = 512);
|
|
// start/stop comm watching
|
BOOL StartMonitoring();
|
BOOL RestartMonitoring();
|
BOOL StopMonitoring();
|
|
DWORD GetWriteBufferSize();
|
DWORD GetCommEvents();
|
DCB GetDCB();
|
|
void WriteToPort(unsigned char* Data, UINT size);
|
void ClearReadBuff(void);
|
|
BOOL m_ReadComplete;
|
unsigned char m_ReadBuff[256];
|
int m_ReadCount;
|
BOOL m_bThreadRun;
|
|
protected:
|
// protected memberfunctions
|
void ProcessErrorMessage(char* ErrorText);
|
static UINT CommThread(LPVOID pParam);
|
static void ReceiveChar(CSerialPort* port, COMSTAT comstat);
|
static void WriteChar(CSerialPort* port);
|
|
// thread
|
CWinThread* m_Thread;
|
|
// synchronisation objects
|
CRITICAL_SECTION m_csCommunicationSync;
|
BOOL m_bThreadAlive;
|
|
// handles
|
HANDLE m_hShutdownEvent;
|
HANDLE m_hComm;
|
HANDLE m_hWriteEvent;
|
|
// Event array.
|
// One element is used for each event. There are two event handles for each port.
|
// A Write event and a receive character event which is located in the overlapped structure (m_ov.hEvent).
|
// There is a general shutdown when the port is closed.
|
HANDLE m_hEventArray[3];
|
|
// structures
|
OVERLAPPED m_ov;
|
COMMTIMEOUTS m_CommTimeouts;
|
DCB m_dcb;
|
|
// misc
|
UINT m_nPortNr;
|
unsigned char* m_szWriteBuffer;
|
DWORD m_dwCommEvents;
|
DWORD m_nWriteBufferSize;
|
UINT m_WriteDataSize;
|
};
|
|
#endif __SERIALPORT_H__
|