?? serialport.h
字號:
/*
** FILENAME CSerialPort.h
**
** PURPOSE This class can read, write and watch one serial port.
** It sends messages to its owner when something happends on the port
** The class creates a thread for reading and writing so the main
** program is not blocked.
**
** CREATION DATE 15-09-1997
** LAST MODIFICATION 12-11-1997
**
** AUTHOR Remon Spekreijse
**
**
*/
#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.
#define WM_COMM_PERR_DETECTED WM_USER+10 // Printer error detected
#define WM_COMM_RX80FULL_DETECTED WM_USER+11 // Receive buffer is 80 percent full
#define WM_COMM_SPECIFYEVENT1 WM_USER+12 // Provider specific event 1
#define WM_COMM_SPECIFYEVENT2 WM_USER+13 // Provider specific event 2
#define WM_COMM_EVENT WM_USER+100 // COMM event
#define WM_COMM_ERROR WM_USER+101 // comm error
#define COMM_ERR_RXOVER 201 // Receive Queue overflow
#define COMM_ERR_OVERRUN 202 // Receive Overrun Error
#define COMM_ERR_RXPARITY 203 // Receive Parity Error
#define COMM_ERR_FRAME 204 // Receive Framing error
#define COMM_ERR_BREAK 205 // Break Detected
#define COMM_ERR_TXFULL 206 // TX Queue is full
#define COMM_ERR_PTO 207 // LPTx Timeout
#define COMM_ERR_IO 208 // LPTx I/O Error
#define COMM_ERR_DNS 209 // LPTx Device not selected
#define COMM_ERR_OOP 210 // LPTx Out-Of-Paper
#define COMM_ERR_MODE 211 // Requested mode unsupported
#define COMM_ERR_BADID 212 // Invalid or unsupported id
#define COMM_ERR_NOPEN 213 // Device Already Open
#define COMM_ERR_MEMORY 214 // Unable to allocate queues
#define COMM_ERR_DEFAULT 215 // Error in default parameters
#define COMM_ERR_HARDWARE 216 // Hardware Not Present
#define COMM_ERR_BYTESIZE 217 // Illegal Byte Size
#define COMM_BAUDRATE 218 // Unsupported BaudRate
#define DEFAULT_BUFSIZE 0x800 // 2K
#ifndef _COMSEND_HEX
#define _COMSEND_HEX
#endif
#ifndef _USE_DEFAULT_BUFSIZ
#define _USE_DEFAULT_BUFSIZ
#endif
enum {COMERRSTATE_READ, COMERRORSTATE_WRITE};
typedef struct _ComErrorState
{
DWORD dwErrFlag;
int enWhile;
}ComErrorState;
typedef struct _ComSendStruct
{
ULONG nSizeBuf;
#ifdef _USE_DEFAULT_BUFSIZ
BYTE sendBuf[DEFAULT_BUFSIZE];
#else
BYTE* sendBuf;
#endif
}ComSendStruct;
/*
typedef struct _ComRcvStruct
{
int nSize;
LPCTSTR lpszBuf;
}ComRcvStruct;
*/
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);
// port termination
int ClosePort();
// start/stop comm watching
BOOL StartMonitoring();
BOOL RestartMonitoring();
BOOL StopMonitoring();
DWORD GetWriteBufferSize();
DWORD GetCommEvents();
DCB GetDCB();
BOOL IsRunning() {return m_bThreadRunning;}
BOOL IsNeedThreadStopping() {return m_bNeedThreadStop;}
void NeedThreadStopping(BOOL bNeed) {m_bNeedThreadStop = bNeed;}
void WriteToPort(void* string, ULONG nCount);
CString GetComName() {return m_sComName;}
void SetComName(CString s)
{
m_sComName = s;
}
protected:
static void CommErrorProc(HWND hRcvWnd, DWORD dwErrorCode, LPARAM dwPortNum, BOOL bRead = TRUE);
// 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;
HANDLE m_hOpenCom;
HANDLE m_hCloseCom;
// 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[5];
// structures
OVERLAPPED m_ov;
COMMTIMEOUTS m_CommTimeouts;
DCB m_dcb;
// owner window
CWnd* m_pOwner;
// misc
UINT m_nPortNr;
#ifndef _COMSEND_HEX
BYTE* m_szWriteBuffer;
#else
ComSendStruct m_comWriteBuffer;
#endif
DWORD m_dwCommEvents;
DWORD m_nWriteBufferSize;
CString m_sComName;
BOOL m_bThreadRunning;
BOOL m_bNeedThreadStop;
};
#endif __SERIALPORT_H__
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -