일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 빅데이타
- 우리들교회
- c++
- 김양재 목사
- Deep learning
- Artificial Intelligence
- nodeJS
- No SQL
- 빅 데이타
- 데이터 과학
- node.js
- 빅데이터
- data science
- probability
- Machine Learning
- 김양재
- 빅 데이터
- R
- WebGL
- Big Data
- 김양재 목사님
- 확률
- openCV
- 몽고디비
- 딥러닝
- 인공지능
- 주일설교
- Statistics
- MongoDB
- 통계
Archives
- Today
- Total
Scientific Computing & Data Science
[Programming / C&C++] Serial Port Example 본문
COM Port Serial 통신 예제
SerialPort.h
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(); |
'Programming > C&C++' 카테고리의 다른 글
[C/C++] DLL 작성 및 사용하기 (3) | 2016.05.14 |
---|---|
[C/C++] Performance 측정 (0) | 2015.09.26 |
[C/C++] MFC / 시스템의 드라이브 정보 표시 (0) | 2015.01.02 |
[C/C++] MFC / 시스템의 드라이브 문자 표시 (0) | 2015.01.02 |
[C/C++] MFC / CFile의 UTF 문자를 파일에 쓰기 (1) | 2014.09.23 |