SDC C-Project CF Review 프로그램
LYW
2021-07-08 630eb072cca33a7c633f6429a0b5a531d1b83268
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#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__