04-07 06:55
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Programming / C&C++] Serial Port Example 본문

Programming/C&C++

[Programming / C&C++] Serial Port Example

cinema4dr12 2016. 11. 17. 11:11

COM Port Serial 통신 예제


SerialPort.h

SerialPort.h


SerialPort.cpp

SerialPort.cpp



[SerialPort.h]

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
#pragma once
 
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
class CSerialPort
{
public:
    CSerialPort( void );
    virtual ~CSerialPort( void );
 
private:
    HANDLE          m_hComm;
    DCB             m_dcb;
    COMMTIMEOUTS    m_CommTimeouts;
    BOOL            m_bPortReady;
    BOOL            m_bWriteRC;
    BOOL            m_bReadRC;
    DWORD           m_iBytesWritten;
    DWORD           m_iBytesRead;
    DWORD           m_dwBytesRead;
 
public:
    bool OpenPort( CString portname );
    void ClosePort();
    bool ReadByte( BYTE &resp );
    bool ReadByte( BYTE* &resp, UINT size );
    bool WriteByte( BYTE bybyte );
    bool SetCommunicationTimeouts( DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier,DWORD WriteTotalTimeoutConstant );
    bool ConfigurePort( DWORD BaudRate, BYTE ByteSize, DWORD fParity, BYTE Parity, BYTE StopBits );
};



[SerialPort.cpp]

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include "SerialPort.h"
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
// *******************************************
// Class Constructor
// *******************************************
CSerialPort::CSerialPort() 
{
    //
}
 
 
// *******************************************
// Class Destructor
// *******************************************
CSerialPort::~CSerialPort()
{
    //
}
 
 
// *******************************************
// Open Port
// *******************************************
bool CSerialPort::OpenPort( CString portname )
{
    m_hComm = CreateFile( L"//./" + portname, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 );
 
    if ( m_hComm == INVALID_HANDLE_VALUE )
        return false;
    else
        return true;
}
 
 
// *******************************************
// Configure Port
// *******************************************
bool CSerialPort::ConfigurePort( DWORD BaudRate, BYTE ByteSize, DWORD fParity, BYTE Parity, BYTE StopBits )
{
    if ( ( m_bPortReady = GetCommState( m_hComm, &m_dcb ) ) == 0 )
    {
        ::OutputDebugString( _T("GetCommState Error") );
        CloseHandle( m_hComm );
 
        return false;
    }
 
    m_dcb.BaudRate          = BaudRate;
    m_dcb.ByteSize          = ByteSize;
    m_dcb.Parity            = Parity;
    m_dcb.StopBits          = StopBits;
    m_dcb.fBinary           = true;
    m_dcb.fDsrSensitivity   = false;
    m_dcb.fParity           = fParity;
    m_dcb.fOutX             = false;
    m_dcb.fInX              = false;
    m_dcb.fNull             = false;
    m_dcb.fAbortOnError     = true;
    m_dcb.fOutxCtsFlow      = false;
    m_dcb.fOutxDsrFlow      = false;
    m_dcb.fDtrControl       = DTR_CONTROL_DISABLE;
    m_dcb.fDsrSensitivity   = false;
    m_dcb.fRtsControl       = RTS_CONTROL_DISABLE;
    m_dcb.fOutxCtsFlow      = false;
    m_dcb.fOutxCtsFlow      = false;
 
    m_bPortReady = SetCommState( m_hComm, &m_dcb );
 
    if ( m_bPortReady == 0 )
    {
        ::OutputDebugString( _T("SetCommState Error") );
        CloseHandle( m_hComm );
 
        return false;
    }
 
    return true;
}
 
 
// *******************************************
// Set Communication Timeouts
// *******************************************
bool CSerialPort::SetCommunicationTimeouts( DWORD ReadIntervalTimeout,
                                            DWORD ReadTotalTimeoutMultiplier,
                                            DWORD ReadTotalTimeoutConstant,
                                            DWORD WriteTotalTimeoutMultiplier,
                                            DWORD WriteTotalTimeoutConstant )
{
    if ( ( m_bPortReady = GetCommTimeouts( m_hComm, &m_CommTimeouts ) ) == 0 )
        return false;
 
    m_CommTimeouts.ReadIntervalTimeout          = ReadIntervalTimeout;
    m_CommTimeouts.ReadTotalTimeoutConstant     = ReadTotalTimeoutConstant;
    m_CommTimeouts.ReadTotalTimeoutMultiplier   = ReadTotalTimeoutMultiplier;
    m_CommTimeouts.WriteTotalTimeoutConstant    = WriteTotalTimeoutConstant;
    m_CommTimeouts.WriteTotalTimeoutMultiplier  = WriteTotalTimeoutMultiplier;
     
    m_bPortReady = SetCommTimeouts( m_hComm, &m_CommTimeouts );
     
    if ( m_bPortReady == 0 )
    {
        ::OutputDebugString( _T("StCommTimeouts function failed : COM Port Error") );
        CloseHandle( m_hComm );
 
        return false;
    }
 
    return true;
}
 
 
// *******************************************
// Write Byte
// *******************************************
bool CSerialPort::WriteByte( BYTE bybyte )
{
    int iBytesWritten = 0;
     
    if ( WriteFile( m_hComm, &bybyte, 1, &m_iBytesWritten, NULL ) == 0 )
        return false;
    else
        return true;
}
 
 
// *******************************************
// Read Byte
// *******************************************
bool CSerialPort::ReadByte( BYTE &resp )
{
    BYTE rx;
    resp = 0;
 
    DWORD dwBytesTransferred=0;
 
    if ( ReadFile( m_hComm, &rx, 1, &dwBytesTransferred, 0 ) )
    {
        if ( dwBytesTransferred == 1 )
        {
            resp = rx;
            return true;
        }
    }
               
    return false;
}
 
 
// *******************************************
// Read Byte (Overriding)
// *******************************************
bool CSerialPort::ReadByte( BYTE* &resp, UINT size )
{
    DWORD dwBytesTransferred = 0;
 
    if ( ReadFile( m_hComm, resp, size, &dwBytesTransferred, 0 ) )
    {
        if ( dwBytesTransferred == size )
            return true;
    }
 
    return false;
}
 
 
// *******************************************
// Close Port
// *******************************************
void CSerialPort::ClosePort()
{
    CloseHandle( m_hComm );
    return;
}



[Example Code]

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
CSerialPort _serial;
 
_serial.ClosePort();
 
if ( _serial.OpenPort( L"COM3" ) )
{
    ::OutputDebugString( _T("Succeded to Open Port\n") );
    _serial.ConfigurePort( CBR_9600, 8, FALSE, NOPARITY, ONESTOPBIT );
 
    // Timeout configuration
    _serial.SetCommunicationTimeouts( 0, 0, 0, 0, 0 );
 
    // memory buffer
    BYTE* pByte = new BYTE[512];
 
    CString strData = _T("");
    CString strTmp = _T("");
 
    if ( _serial.ReadByte( pByte, 512 ) )
    {
        pByte[511] = '\0';
 
        strData = CString( reinterpret_cast<char*>( pByte ) );
        strTmp = _T("DATA :");
 
        strTmp += strData;
        strTmp += _T("\n");
 
        ::OutputDebugString( strTmp );
    }
    else
    {
        ::OutputDebugString( _T("Failed to read data\n") );
    }
 
    delete [] pByte;
}
else
{
    ::OutputDebugString( _T("Failed to Open Port\n") );
}
 
_serial.ClosePort();



Comments