자료 참고 안내 1. 본 자료실의 모든 자료 저작권은 ㈜에이치앤에스에 있습니다.

본 자료는 개발하시는데 참고자료 용도로 사용하실 수 있으며 저작권 표시 없이 복사,게재, 출판 하실 수 없습니다. 외부 게재 사용 시 반드시 출처 항목에 회사명과 사이트 주소를 반드시 명시해 주시기 바랍니다.
[표기 예] 출처 : ㈜에이치앤에스(www.hnsts.co.kr) 또는 ㈜HNS(www.hnsts.co.kr)

2. 제품 개발 시 내용과 예제 코드는 수정 및 검증작업을 직접 하셔야 하며 문제 발생에 대한 책임은 ㈜HNS사와 무관합니다.

본사는 자료를 최신내용으로 유지하기 위해 노력하고 있으며 제공되는 정보의 오류 및 내용이 정확하지 않을 경우 사전 공지 없이 업데이트 될 수 있습니다. 자료의 문제점 발견 시 본사로 문의주시면 검토하여 자료를 수정하도록 하겠습니다.

C++(MFC)용 시리얼(SerialPort) 통신 예제
작성일 2018-08-28 수정일 2022-10-06 조회수 2326
분류 Knowhow
적용
플랫폼
키워드 CPP 시리얼 통신, C++ Serial 통신
첨부파일 Tech48_C++(MFC)용 시리얼(SerialPort)_예제소스파일.zip

본 자료는
1. 송/수신 데이터 구조(Protocol)
2. CSerialPort Class Interface (기능과 내부인자)
3. CQueue Class Interface (기능과 내부인자)
4. 포트 설정 방법
5. 수신 스레드(Thread)
순서로 진행합니다.

본 시리얼(Serial) 통신 예제는 C++로 제작되었으며 데이터는 프레임(Frame) 단위(STX + Data + CheckSum + ETX)로 구현되었습니다. 여기서 프레임은 프로토콜을 말하며 사용하시는 장치에 따라서 프로토콜의 구조는 달라질 것입니다. 수신 처리는 스레드(Thread)로 동작하며 수신된 데이터는 프레임 단위로 수신큐(Queue)에 저장되도록 구현하였습니다.


1. 송/수신 데이터 구조(Protocol)

시리얼 통신을 위한 송/수신 데이터의 프로토콜(Protocol) 정의

데이터의 프레임(Frame) 구조
STX[1byte] Data[N Byte] CheckSum[1Byte] ETX[1Byte]

STX는 프레임의 시작 코드로서 기본 설정값은 0x02입니다.
ETX는 프레임의 종료 코드로서 기본 설정값은 0x03입니다.
체크섬(CheckSum)은 에러 체크 코드(Error Check Code)로 여기서는 CheckSum8을 사용하였습니다.

void CSerialPort::SendCommand(CString strCmd, CString strData)
{
BYTE sendData[FRAMESIZE]; // FrameSize만큼의 바이트 배열 선언
sendData[0] = STX; // Frame의 첫번째 바이트에 STX 입력
sendData[FRAMESIZE - 2] = GetCheckSum8(sendData, 0, FRAMESIZE - 2);
// Frame의 마지막에서 2번째 바이트에 CheckSum 입력
sendData[FRAMESIZE - 1] = ETX;
// Frame의 마지막 바이트에 ETX 입력
}
(인자) CString strCmd
(인자) CString strData
(반환값) 없음

수신 데이터의 구조 변경은 INT CSerialPort::ReadThreadProc(LPVOID lParam) 코드를 수정해야 합니다.


참고 자세한 내용은 첨부된 소스파일(CSerialPort.cpp)을 참고 바랍니다.

2. CSerialPort Class Interface (기능과 내부인자)

시리얼(Serial) 통신에 관련된 모든 기능을 담당하는 CSerialPort 클래스로서 세부 내용은 다음과 같이 이루어져 있습니다.

시리얼 통신을 위한 포트 오픈(Open)
bool CSerialPort::OpenPort(int Port, DWORD Baud)
(인자) int Port : 포트 번호 1부터 시작
(인자) DWORD Baud : 통신 속도
(반환값) bool : 포트 정상 오픈(Open)이면 True이고 실패하면 False 반환

포트 사용을 마치고 포트를 닫음
void CSerialPort::ClosePort()
(인자) 없음
(반환값) 없음

데이터를 송신할 때 사용
void CSerialPort::WritePort(BYTE* pData, DWORD dwWrite)
(인자) BYTE* pData : 송신 데이터
(인자) DWORD dwWrite : 송신 데이터의 사이즈
(반환값) 없음

데이터를 수신할 때 사용
DWORD CSerialPort::ReadPort (BYTE* pBuffer, DWORD dwR)
(인자) BYTE* pBuffer : 수신 데이터
(인자) DWORD dwR : 수신 블록 사이즈
(반환값) DWORD

통신 버퍼의 초기화에 사용. 포트를 비울 때 사용
void CSerialPort::ResetPort()
(인자) 없음
(반환값) 없음

포트를 셋팅할 때 사용
BOOL CSerialPort::ConfigPort(DWORD Baud, int ByteSize, int Parity, int StopBits)
m_DCB(구조체)의 변수들을 초기화함
(인자) DWORD Baud : 통신속도
(인자) int ByteSize : 바이트 크기
(인자) int Parity : 패리티 비트
(인자) int StopBits : 스탑 비트
(반환값) bool : 포트 관련 설정 이후 SetCommState()가 정상 동작하는 경우 TRUE를 반환

모뎀 제어신호를 감시하거나 상태를 확인
BYTE CSerialPort::GetModemStatus()
(인자) 없음
(반환값) BYTE : 모뎀의 제어 레지스터 값의 상태를 반환

수신 스레드(Thread)
수신된 데이터의 처리를 담당하는 스레드로 프레임 구조 및 데이터의 Parsing 처리와 수신된 데이터에 따른 모든 처리를 하고 있는 함수로 제작하고자 하시는 프로그램에 맞게 변경하여 처리하시면 됩니다.
UINT CSerialPort::ReadThreadProc(LPVOID lParam)
(인자) LPVOID lParam
(반환값) UINT

포트 오픈하고 수신 스레드 생성
bool CSerialPort::ReadStart(int Port, DWORD Baud)
(인자) int Port : 포트 번호
(인자) DWORD Baud : 통신 속도
(반환값) bool : 수신스레드가 정상 생성되면 TRUE 반환, 정상 생성 안되면 FALSE

포트닫는 기능 수행. ClosePort()를 호출
void CSerialPort::ReadStop()
(인자) 없음
(반환값) 없음

수신된 데이터가 에러가 발생하였는지 확인
BYTE CSerialPort::GetCheckSum8(BYTE *pByte, int iStart, int iLen)
(인자) BYTE *pByte : 송신 데이터
(인자) int iStart : 시작 위치 0
(인자) int iLen : 프레임 사이즈. FRAMESIZE -2 (반환값) BYTE

참고 자세한 내용은 첨부된 소스파일(CSerialPort.cpp)을 참고 바랍니다.

3. CQueue Class Interface (기능과 내부인자)

큐 데이터를 관리하는 CQueue 클래스(Class).

큐 데이터 관리 클래스

Queue에서 알아야 할 중요한 함수는 Init(큐의 사이즈 지정 및 초기화), Insert(EnQueue. 큐에 데이터 삽입), Extract(DeQueue. 큐에서 데이터 추출)입니다.

Init : 큐의 사이즈를 정하고 메모리를 할당
void init(int size)
(인자) int size : Queue의size(프레임 개수)를 정하고 메모리 초기화. 예를 들어 100으로 지정하는 경우 100개의 프레임 사이즈를 정하고 초기화합니다.
(반환값) 없음

EnQueue : 큐에 데이터 삽입
bool insert(const T& val)
(인자) const T& val : 큐에 입력하는 데이터
(반환값) BOOL : 큐에 데이터가 정상 삽입되는 경우 TRUE 반환

DeQueue : 큐에서 데이터 추출
bool extract(T* val)
(인자) T* val : 큐에서 추출하는 데이터
(반환값) BOOL : 큐에서 데이터가 정상 추출되는 경우 TRUE 반환

큐에 데이터 삽입 예제

////////////////////////////// CQueueDlg.h에서 //////////////////////////////
private:
CQueue m_Queue1;   // 멤버 변수 선언

////////////////////////////// CQueueDlg.cpp에서 //////////////////////////////
m_Queue1.init(500);    // 초기화, Queue의 size를 정하고 메모리 할당

// EnQueue. 삽입

void CCQueueDlg::OnBnClickedButton1() {

DWORD dwRead;   // 읽은 바이트 수
dwRead =3;

BYTE* pEnQueueData;   // BYTE *형 변수 선언
pEnQueueData = new BYTE[dwRead];
memset(pEnQueueData, 0, dwRead);   // pEnQueueData를 dwRead 사이즈 0으로 초기화

pEnQueueData[0] = 'a';
pEnQueueData[1] = 'b';
pEnQueueData[2] = 'c';

m_Queue1.insert(pEnQueueData);   // 큐에 데이터 프레임(‘abc’) 삽입
}

////////////////////////////// CQueue.h에서 //////////////////////////////
// 큐에 데이터 삽입
bool insert(const T& val)
{
nSize = 1024;
EnterCriticalSection(&cs);
//Full인 경우는 false를 return
if(nNum+1 > nSize)
{
LeaveCriticalSection(&cs);   // 크리티컬 섹션 탈출
return false;
}
nNum++;
Rear → Next → value = val;   // val를 큐의 마지막(Rear)에 삽입
Rear → Next = Rear → Next → Next;
LeaveCriticalSection(&cs);
return true;
}


큐에서 데이터 추출 예제

////////////////////////////// CQueueDlg.cpp 에서//////////////////////////////
// DeQueue.
void CCQueueDlg::OnBnClickedButton2()
{

BYTE* recRaw;
TCHAR recData[1024];

if(m_Queue1.extract(&recRaw) == true)
{
memset(recData, 0, 200);
AsciiToUnicode((LPCSTR)recRaw, recData);   // ASCII를 UniCode로 변경
m_RecList.AddString(recData);   // 데이터 ListBox에 추가
}
}

////////////////////////////// CQueue.h에서 //////////////////////////////
// 큐에 데이터를 추출
bool extract(T* val)
{
EnterCriticalSection(&cs);
// 자료가 없는 경우는 false를 return
if(nNum==0)
{
*val = 0;
LeaveCriticalSection(&cs);   // 크리티컬 섹션 탈출
return false;
}
nNum--;
*val = Front → Next → value;   // 큐의 맨 앞(Front)를 *val에 저장
Front->Next = Front → Next → Next;
LeaveCriticalSection(&cs);
return true;
}



참고자세한 내용은 첨부된 소스파일(CQueue)을 참고 바랍니다.

4. 포트 설정 방법
포트 Open 설명
bool CSerialPort::OpenPort(int Port, DWORD Baud)
{
// 포트 생성
m_hCom = CreateFile(m_strPort, GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, NULL);
// 통신 장치에 모니터링할 이벤트 세트를 지정
SetCommMask( m_hCom, EV_RXCHAR);
// InQueue, OutQueue 크기 설정
SetupComm( m_hCom, 1024, 1024);
// 포트 비우기. PurgeComm() 호출
ResetPort();
// timeout 설정
timeouts.ReadIntervalTimeout = 500;                  // 다음 문자를 받기까지 기다리는 시간
timeouts.ReadTotalTimeoutMultiplier = 0;        // 읽은 문자 수에 비례하여 기다리는 시간 늘여줌
timeouts.ReadTotalTimeoutConstant = 100;    // 읽기에서 총 기다리는 시간을 밀리초로 설정
timeouts.WriteTotalTimeoutMultiplier = 10;     // 쓰기에서 문자 수에 비례하여 기다리는 시간 늘여줌
timeouts.WriteTotalTimeoutConstant = 0;        // 쓰기에서 총 기다리는 시간을 밀리초로 설정
}
(인자) int Port : 포트 번호
(인자) DWORD Baud : 통신속도
(반환값) bool : 정상적으로 포트가 오픈되면 TRUE

지정된 통신 장치의 통신 매개변수를 초기화
SetupComm( HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue)
(인자) HANDLE hFile : 통신장치의 핸들, CreateFile 함수의 리턴된 핸들
(인자) DWORD dwInQueue : 장치의 내부 입력 버퍼크기를 byte 단위로 지정
(인자) DWORD dwOutQueue : 장치의 내부 출력 버퍼크기를 byte 단위로 지정
(반환값) Bool은 정상적으로 매개변수의 초기화가 되면 TRUE 반환

지정된 통신 장치의 통신 매개변수를 초기화
SetupComm( HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue)
(인자) HANDLE hFile : 통신 장치의 핸들, CreateFile 함수의 리턴된 핸들
(인자) DWORD dwInQueue : 장치의 내부 입력 버퍼크기를 byte 단위로 지정
(인자) DWORD dwOutQueue : 장치의 내부 출력 버퍼크기를 byte 단위로 지정
(반환값) Bool은 정상적으로 매개변수의 초기화가 되면 TRUE 반환

포트 비우기
PurgeComm( m_hCom,PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT |
PURGE_RXCLEAR);
(인자) m_hCom는 통신 자원의 핸들, CreateFile 함수의 리턴된 핸들
(인자) PURGE_TXABORT : 모든 미해결된 Overlapped 쓰기 작업을 종료하고 쓰기 작업이 완료가 되지 않았더라도 즉시 반환
(인자) PURGE_TXCLEAR : 출력 버퍼를 클리어
(인자) PURGE_RXABORT : 입력 버퍼를 클리어
(인자) PURGE_RXCLEAR : 모든 미해결된 Overlapped 읽기 작업을 종료하고 읽기 작업이
완료가 되지 않았더라도 즉시 반환

5. 수신 스레드(Thread)
수신 스레드(Thread)
수신된 데이터의 처리를 담당하는 스레드로 프레임 구조 및 데이터의 Parsing 처리와 수신된 데이터에 따른 모든 처리를 하고 있는 함수로 제작하고자 하시는 프로그램에 맞게 변경하여 처리하시면 됩니다.
UINT CSerialPort::ReadThreadProc(LPVOID lParam)
(인자) LPVOID lParam
(반환값) UINT

// 수신 스레드(ReadThreadProc) 설명
UINT CSerialPort::ReadThreadProc(LPVOID lParam)
{
// 포트를 감시하는 루프
while (pSerial->m_bOpen)
{
// COM 포트에서 메시지가 들어오면 리턴하는 함수
// 메시지가 안들어 오면 무한 블러킹
WaitCommEvent(pSerial->m_hCom, &dwEvent, NULL);
// 데이터가 수신되었다는 메시지가 발생하면
if ((dwEvent & EV_RXCHAR) == EV_RXCHAR)
{
// 데이터 수신부
if(dwRead = pSerial->ReadPort(lnData, pSerial->m_nMaxBlock))
//*************[ Parsing - Start Code ] *************//
//*************[ Parsing - End Code ] *************/
}
}
}

COM(m_hComPort)에서 메시지가 들어오면 리턴하는 함수. 메시지가 안 들어오면 무한 블러킹
Bool WaitCommEvent( HANDLE hFile, LPDWORD lpEvtMask, LPOVERLAPPED lpOverlapped );
(인자) HANDLE hFile : 장치 핸들. CreateFile 함수에서 리턴한 핸들
(인자) LPDWORD lpEvtMask : 수신 이벤트 받을 포인터
(인자) LPOVERLAPPED lpOverlapped : 중첩 구조체 포인터. 에러 시 0값
(반환값) BOOL

데이터 수신을 담당
pSerial → ReadPort(lnData, pSerial → m_nMaxBlock)
(인자) lnData : 수신 측에 들어오는 데이터
(인자) pSerial → m_nMaxBlock 블록의 사이즈
(반환값) DWORD는 읽은 데이터의 사이즈
C++ 예제코드
소스 코드는 참고 및 학습용으로 버그 및 여러가지 문제가 있을 수 있습니다.

[예제 동작 순서] C++(MFC)용 시리얼(SerialPort) 통신 예제 (IEC1000-Series 기준)
STEP-1. PortOpen. 사용자 지정 포트 열기
STEP-2. 데이터보내기
STEP-3. 송신부. UniCode를 Ascii코드로 변경
STEP-4. 수신부. Ascii코드를 유니코드(UniCode)로 변경 시
STEP-5. Port Close. 사용자 지정 포트 닫기

// STEP-1. PortOpen. 사용자 지정 포트 열기
void CHNS_SerialTestDlg::OnPortOpen()
{
// 참고) 패리티 비트, 데이터 비트, 스톱 비트는 실무에서 변경되는 경우가 없이 고정으로 사용되는 경우가 많아 해당 내용은 예제에서 생략되었습니다.
// 시리얼(Serial) 통신 시작. 포트 오픈. 수신 데이터 감지
m_SerialPort.ReadStart(byIndexComPort(m_SerialPortNo), byIndexBaud(m_BaudRate));
// SetTimer(Timer의ID, 반복 실행 주기, 함수명) Timer의 ID값은 3이고 0.5초마다 반복 실행. 함수명 NULL 사용 시 오버라이드 함수 OnTimer()로 작동
SetTimer(3, 500, NULL);
}
// STEP-2. 데이터 보내기
void CHNS_SerialTestDlg::OnSend()
{
CString strReadData;
Char sendData[1024];
// 해당 컨트롤의 텍스트를 가져옴
m_EditSend.GetWindowText(strReadData);
// 데이터 송신하기
m_SerialPort.WritePort((unsigned char*)UnicodeToAscii(strReadData.GetBuffer(0),
sendData), strReadData.GetLength());
}
// STEP-3. 송신부. UniCode를Ascii 코드로 변경
LPSTR CHNS_SerialTestDlg::UnicodeToAscii(LPWSTR lpData,LPSTR lpReturndata)
{
// WideCharToMultiByte의 인자 설명
// UINT CodePage → 변환할 코드 페이지(기본적으로 CP_ACP 사용).   // DWORD dwFlags → 변환 타입을 나타낸다.
// LPCWSTR lpWideCharStr → 변환할 문자열.   // Int cchWideChar → 변화할 문자열의 사이즈
// LPSTR lpMultiByteStr → 변환값 저장 버퍼.   // Int cbMultiByte → 변환될 값의 사이즈
WideCharToMultiByte(CP_ACP, 0, lpData, wcslen(lpData), lpReturndata, wcslen(lpData)*2,
NULL, NULL);
return lpReturndata;
}
// STEP-4. 수신부. Ascii 코드를 유니코드(UniCode)로 변경 시
LPWSTR CHNS_SerialTestDlg::AsciiToUnicode(LPCSTR lpData,LPWSTR lpwszReturn)
{
// MultiByteToWideChar의 인자 설명
// UINT CodePage → 변환할 코드 페이지( 기본적으로 CP_ACP 사용).   // DWORD dwFlags → 변환 타입을 나타낸다.
// LPCSTR lpMultiByteStr   // 변환할 문자열.   // int cbMultiByte → 변화할 문자열의 사이즈
// LPWSTR lpWideCharStr   // 변환값 저장 버퍼.   // int cchWideChar → 변환될 값의 사이즈
MultiByteToWideChar(CP_ACP, 0, lpData, -1, lpwszReturn, strlen(lpData)*2);
return lpwszReturn;
}
// Timer에서 정한 시간마다 수신 데이터를 읽어 수신 리스트 박스에 출력
void CHNS_SerialTestDlg::OnTimer(UINT nIDEvent)
{
CString strRec;
byte* recRaw;

if(nIDEvent == 3)
{
TCHAR recData[1024];
if(m_SerialPort.m_RecFrameDatas.extract(&recRaw) == true)
{
memset(recData, 0, 200);
AsciiToUnicode((LPCSTR)recRaw, recData);
m_RecList.AddString(recData);
}
}
CDialog::OnTimer(nIDEvent);
}

// ComboBox에서 선택한 리스트에 해당하는 포트 번호 반환
int CHNS_SerialTestDlg::byIndexComPort(int xPort)
{
int PortName;
switch(xPort)
{
// 0번째 리스트를 선택하는 경우 포트 번호 '1' 반환
case 0: PortName = 1; break;
case 1: PortName = 2; break;
case 2: PortName = 3; break;
case 3: PortName = 4; break;
case 4: PortName = 7; break;
}
return PortName;
}
// ComboBox에서 선택한 리스트에 해당하는 통신속도 반환
DWORD CHNS_SerialTestDlg::byIndexBaud(int xBaud)
{
DWORD dwBaud;
switch(xBaud)
{
// 0번째 리스트를 선택하는 경우 통신속도 '9600' 반환
case 0: dwBaud = CBR_9600; break;
case 1: dwBaud = CBR_14400; break;
case 2: dwBaud = CBR_19200; break;
case 3: dwBaud = CBR_38400; break;
case 4: dwBaud = CBR_56000; break;
case 5: dwBaud = CBR_57600; break;
case 6: dwBaud = CBR_115200; break;
}
return dwBaud;
}
// 사용자가 콤보 상자의 목록에서 현재 선택 영역을 변경할 때 발생. 포트 번호 변경 시 발생
void CHNS_SerialTestDlg::OnSelchangeSerialPort()
{
UpdateData(TRUE);
CString change,str;
m_SerialPortNo = m_cSerialPort.GetCurSel();
m_cSerialPort.GetLBText(m_SerialPortNo,str);
}
// 사용자가 콤보 상자의 목록에서 현재 선택 영역을 변경할 때 발생. 통신속도 변경 시 발생
void CHNS_SerialTestDlg::OnSelchangeBaudRate()
{
UpdateData(TRUE);
CString change,str;
m_BaudRate = m_cBaudRate.GetCurSel();
m_cBaudRate.GetLBText(m_BaudRate,str);
}
// STEP-5. Port Close. 사용자 지정 포트 닫기
void CHNS_SerialTestDlg::OnPortClose()
{
KillTimer(3);
m_SerialPort.ReadStop();
}
맨 위로
팝업닫기

(주)에이치앤에스('http://hnsts.co.kr/'이하 '(주)에이치앤에스 웹사이트')는 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원활하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.

(주)에이치앤에스 웹사이트는 개인정보처리방침을 개정하는 경우 웹사이트 공지사항(또는 개별공지)을 통하여 공지할 것입니다.

○ 본 방침은 2011년 4월 1일부터 시행됩니다.

1. 개인정보의 처리 목적 (주)에이치앤에스 웹사이트는 개인정보를 다음의 목적을 위해 처리합니다. 처리한 개인정보는 다음의 목적 이외의 용도로는
사용되지 않으며 이용 목적이 변경될 시에는 사전동의를 구할 예정 입니다.
가. 민원사무 처리
민원인의 신원 확인, 민원사항 확인, 사실조사를 위한 연락 · 통지, 처리결과 통보 등을 목적으로 개인정보를 처리합니다.
2. 개인정보 파일 현황
1. 개인정보 파일명 : 고객의 소리
  • - 개인정보 항목 : 이메일, 휴대전화번호, 자택전화번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보
  • - 수집방법 : 웹사이트
  • - 보유근거 : 이용자 동의
  • - 보유기간 : 3년
3. 개인정보의 제3자 제공에 관한 사항
① (주)에이치앤에스 웹사이트는 원칙적으로 이용자의 개인정보를 제1조에서 명시한 목적 범위 내에서 처리하며, 본래의 범위를 초과하여 처리하거나 제3자에게 제공하지 않습니다.
다만, 다음의 경우에는 개인정보를 제3자에게 제공할 수 있습니다.
  • – 이용자가 사전에 제3자 제공 및 공개에 동의한 경우
  • – 법령 등에 의해 제공이 요구되는 경우
  • – 서비스의 제공에 관한 계약의 이행을 위하여 필요한 개인정보로서 경제적/기술적인 사유로 통상의 동의를 받는 것이 현저히 곤란한 경우
  • – 개인을 식별하기에 특정할 수 없는 상태로 가공하여 이용하는 경우
4. 정보주체의 권리,의무 및 그 행사방법 이용자는 개인정보주체로서 다음과 같은 권리를 행사할 수 있습니다.
① 정보주체는 (주)에이치앤에스 웹사이트에 대해 언제든지 다음 각 호의 개인정보 보호 관련 권리를 행사할 수 있습니다.
  • 1. 개인정보 열람요구
  • 2. 오류 등이 있을 경우 정정 요구
  • 3. 삭제요구
  • 4. 처리정지 요구
② 제1항에 따른 권리 행사는 (주)에이치앤에스 웹사이트에 대해 개인정보 보호법 시행규칙 별지 제8호 서식에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 (주)에이치앤에스 웹사이트는
이에 대해 지체 없이 조치하겠습니다.
③ 정보주체가 개인정보의 오류 등에 대한 정정 또는 삭제를 요구한 경우에는 (주)에이치앤에스 웹사이트는 정정 또는 삭제를 완료할 때까지 당해 개인정보를 이용하거나 제공하지 않습니다.
④ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다. 이 경우 개인정보 보호법 시행규칙 별지 제11호 서식에 따른 위임장을
제출하셔야 합니다.
5. 제3자에게의 개인정보 제공
① (주)에이치앤에스 웹사이트는 다음의 개인정보 항목을 처리하고 있습니다.
<민원사무 처리>
– 필수항목 : 이름, 휴대전화번호, 자택전화번호, 이메일, 서비스 이용 기록, 접속로그, 쿠키, 접속IP 정보
6. 개인정보의 파기
(주)에이치앤에스 웹사이트는 원칙적으로 개인정보 처리목적이 달성된 경우에는 지체없이 해당 개인정보를 파기합니다. 파기의 절차, 기한 및 방법은 다음과 같습니다.
  • –파기절차 이용자가 입력한 정보는 목적 달성 후 별도의 DB에 옮겨져(종이의 경우 별도의 서류) 내부 방침 및 기타 관련 법령에 따라 일정기간 저장된 후 혹은 즉시 파기됩니다. 이 때, DB로 옮겨진 개인정보는 법률에 의한 경우가 아니고서는 다른 목적으로 이용되지 않습니다.-파기기한이용자의 개인정보는 개인정보의 보유기간이 경과된 경우에는 보유기간의 종료일로부터 5일 이내에, 개인정보의 처리 목적 달성, 해당 서비스의 폐지, 사업의 종료 등 그 개인정보가 불필요하게 되었을 때에는 개인정보의 처리가 불필요한 것으로 인정되는 날로부터 5일 이내에 그 개인정보를 파기합니다.
  • –파기방법 전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다. 종이에 출력된 개인정보는 분쇄기로 분쇄하거나 소각을 통하여 파기합니다.
7. 개인정보의 안전성 확보 조치
(주)에이치앤에스 웹사이트는 개인정보보호법 제29조에 따라 다음과 같이 안전성 확보에 필요한 기술적/관리적 및 물리적 조치를 하고 있습니다.
1. 정기적인 자체 감사 실시
개인정보 취급 관련 안정성 확보를 위해 정기적(분기 1회)으로 자체 감사를 실시하고 있습니다.
2. 개인정보 취급 직원의 최소화 및 교육
개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.
3. 내부관리계획의 수립 및 시행
개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.
4. 해킹 등에 대비한 기술적 대책
(주)에이치앤에스 웹사이트는 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신·점검을 하며 외부로부터 접근이 통제된 구역에
시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.
5. 개인정보의 암호화
이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의
별도 보안기능을 사용하고 있습니다.
6. 접속기록의 보관 및 위변조 방지
개인정보처리시스템에 접속한 기록을 최소 6개월 이상 보관, 관리하고 있으며, 접속 기록이 위변조 및 도난, 분실되지 않도록 보안기능 사용하고 있습니다.
7. 개인정보에 대한 접근 제한
개인정보를 처리하는 데이터베이스시스템에 대한 접근권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여
외부로부터의 무단 접근을 통제하고 있습니다.
8. 문서보안을 위한 잠금장치 사용
개인정보가 포함된 서류, 보조저장매체 등을 잠금장치가 있는 안전한 장소에 보관하고 있습니다.
9. 비인가자에 대한 출입 통제
개인정보를 보관하고 있는 물리적 보관 장소를 별도로 두고 이에 대해 출입통제 절차를 수립, 운영하고 있습니다.
8. 개인정보 보호책임자 작성
① (주)에이치앤에스 웹사이트는 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를
지정하고 있습니다.
▶ 개인정보 보호책임자
성명 : 김진효
소속 : (주)에이치앤에스
전화번호 : 02-6402-8001
이메일 : hns@hnsts.co.kr
② 정보주체께서는 (주)에이치앤에스 웹사이트의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및
담당부서로 문의하실 수 있습니다. (주)에이치앤에스 웹사이트는 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.
9. 개인정보침해 구제방법
정보주체는 개인정보침해로부터 구제받고자 하는 경우 다음과 같은 기관에 도움을 요청할 수 있습니다.
▶ 개인정보 침해신고센터 (한국인터넷진흥원 운영)
– 소관업무 : 개인정보 침해사실 신고, 상담 신청
– 홈페이지 : privacy.kisa.or.kr
– 전화 : (국번없이) 118
– 주소 : (138-950) 서울시 송파구 중대로 135 한국인터넷진흥원 개인정보침해신고센터
▶ 개인정보 분쟁조정위원회 (한국인터넷진흥원 운영)
– 홈페이지 : privacy.kisa.or.kr
– 전화 : (국번없이) 118
– 주소 : (138-950) 서울시 송파구 중대로 135 한국인터넷진흥원 개인정보침해신고센터
10. 개인정보 처리방침 변경
① 이 개인정보처리방침은 시행일로부터 적용되며, 법령 및 방침에 따른 변경내용의 추가, 삭제 및 정정이 있는 경우에는 변경사항의 시행 7일 전부터 공지사항을 통하여 고지할
것입니다.
팝업닫기

본 웹사이트에 게시된 이메일 주소가 전자우편 수집 프로그램이나 그 밖의 기술적 장치를 이용하여 무단으로 수집되는 것을 거부하며, 이를 위반시 정보통신망법에 의해 형사처벌됨을 유념하시기 바랍니다.

게시일 : 2011.4.1