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

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

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

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

[C#, VB.NET] Smart I/O - Series RS232 - Block 사용 예제
작성일 2018-08-28 수정일 2022-10-06 조회수 2348
분류 SmartX Framework
적용
플랫폼
키워드 스마트통신프로그램, 시리얼통신프로그램, RS232통신PROGRAM
첨부파일 TechNote56_Example.zip

본 예제 프로그램으로 대표적인 하드웨어 장치 제어기능인 SerialPort(SmartSerialPort) 를 테스트해볼 수 있습니다.
SmartX Framework와 관련된 컴포넌트의 자세한 사용법은 SmartX Framework Reference Guide (Programming Guide)의 SmartSerialPort편을 참조하시기 바랍니다.
Smart I/O-Series의 하드웨어적인 설명 및 사용법은 Smart I/O-Series 제품매뉴얼을 참조하시기 바랍니다.


본자료는
1. SmartSerialPort 기본 설명
2. SmartSerialPort 관련 메서드
3. RS232 Block 특징
4. RS232 Block과 센서 결선 안내

4-1. 테스트 적합 센서 안내 및 RS232 Block과 센서 결선
4-2. Smart I/O-2 또는 Smart I/O-3에 RS232 Block 장착

5. 예제 프로그램 동작 설명
6. 프로그램 전체 소스
순서로 설명합니다.



1. SmartSerialPort 기본 설명
SmartSerialPort

SmartSerialPort는 시리얼 통신을 처리하기 위한 컴포넌트로 Event 또는 Polling방식의 기능을 지원 하며 Frame구조와 None-Frame 구조의 통신을 모두 지원하여 다양한 통신환경에 쉽고 편리하게 적용하여 개발할 수 있도록 만들어 진 컴포넌트 입니다.

SmartSerialPort 특징

1. Event 또는 Polling 방식의 수신 기능 지원

2. Event 수신 시 수신 Queue 지원

3. 프레임 구조의 송/수신 기능 지원
- STX(시작 식별 코드), ETX(종료 식별 코드) 코드 사용
- STX(1~2Byte), ETX(1~2Byte) 멀티 바이트 지원

4. 비 프레임 구조 송/수신 기능 지원
- 데이터의 구분 기준은 ReadTimeout 또는 FrameBufferSize를 기준으로 함

5. Error Check 기능 지원
- 프레임/비 프레임 구조 모두 적용 가능
- check-Sum8, check-Sum16, CRC16, CRC32 방식 지원
- Error Code 위치 설정 가능
- Error Code 표현 방식 지원(Binary, ASCII, UNICODE)

6. 송/수신 데이터 표현 방식
- Binary, ASCII, UNICODE

7. RS485 통신 지원
- IEC-Series중 RS485-Software방식인 제품인 경우 송/수신 전환 시 초기 Null 값 수신데이터 제거 기능 지원

참고SmartSerialPort의 자세한 내용은 “자료실 → SmartX Framework 관련 → Reference Guide → Part 3. 하드웨어 장치 제어 컴포넌트 → 3. SmartSerialPort” 내용을 참고하시기 바랍니다.


2. SmartSerialPort 관련 메서드

[표] 통신 방식 및 데이터 구조에 따른 송/수신 함수 및 이벤트

Frame 구조 None - Frame 구조
송신 .Write
Frame()
.Write
NoneFrame()
수신 Polling .Read
Frame()
.Read
NoneFrame()
Event .OnRead
QueueEvent
.OnRead
QueueEvent
.Read
Queue()
.Read
Queue()
SmartSerialPort의 Port를 열기
void Open() (+1 overload)
void Open(SmartSerialPort.BAUDRATE baudRate, SmartSerialPort.COMPORTNO portNo, int iReadTimeout)
(인자) SmartSerialPort.BAUDRATE baudRate : 통신 속도
(인자) SmartSerialPort.COMPORTNO portNo : 통신 포트
(인자) int iReadTimeout : 읽기 작업의 타임아웃 시간 설정
SmartSerialPort의 Port를 닫기
void Close()
Frame 형식의 데이터를 송신합니다.
void WriteFrame(byte[] bytesWrite) (+1 overload)
void WriteFrame(string strWrite, SmartSerialPort.CODETYPES eCode)
(인자) byte[] bytesWrite : Byte[] 형식의 송신 데이터
(인자) string strWrite : String 형식의 수신 데이터
(인자) SmartSerialPort.CODETYPES eCode : 데이터의 타입이 ASCII Code, UniCode인지 설정
NoneFrame 형식의 데이터를 송신합니다.
void WriteNoneFrame (byte[] bytesWrite) (+1 overload)
void WriteNoneFrame (string strWrite, SmartSerialPort.CODETYPES eCode)
(인자) byte[] bytesWrite : Byte[] 형식의 송신 데이터
(인자) string strWrite : String 형식의 송신 데이터
(인자) SmartSerialPort.CODETYPES eCode : 데이터의 타입이 ASCII Code, UniCode인지 설정
데이터가 Frame형식이고 데이터 수신이 Polling 방식인 경우 데이터를 수신합니다.
SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out byte[] bytesRead) (+3 overloads)
SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out string stringRead)
SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out byte[] bytesRead, int iReadTimeout)
SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out string stringRead, int iReadTimeout)
(인자) out byte[] bytesRead : Byte[] 형식의 수신 데이터
(인자) out string stringRead : String 형식의 수신 데이터
(인자) int iReadTimeout : 읽기 작업의 타임아웃 시간 설정
(리턴값) SmartSerialPort.FRAMEDATAREADSTATUS
- EMPTY = 0 (수신 데이터없음)
- VALIDDATA = 1(수신 데이터 정상)
- FAILDATA = 2(수신 데이터 비정상)
데이터가 NoneFrame형식이고 데이터 수신이 Polling 방식인 경우 데이터를 수신합니다.
SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out byte[] bytesRead) (+3 overloads)
SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out string stringRead)
SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out byte[] bytesRead, int iReadTimeout)
SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out string stringRead, int iReadTimeout)
(인자) out byte[] bytesRead : Byte[] 형식의 수신 데이터
(인자) out string stringRead : String 형식의 수신 데이터
(인자) int iReadTimeout : 읽기 작업의 타임아웃 시간 설정
(리턴값) SmartSerialPort.FRAMEDATAREADSTATUS
- EMPTY = 0 (수신 데이터없음)
- VALIDDATA = 1(수신 데이터 정상)
- FAILDATA = 2(수신 데이터 비정상)
데이터가 Frame 또는 NoneFrame 형식을 모두 지원하는 Event 방식의 수신 처리 함수
(ReadQueue + OnReadQueueEvent)
ReceiveDetect가 EventQueue인 경우 데이터가 수신되면(Frame, None-Frame) Frame또는 가상의 FrameData가 Read-Queue에 저장되고 OnReadQueueEvent를 발생합니다.
SmartSerialPort.FRAMEDATAREADSTATUS ReadQueue(out byte[] bytesRead) (+1 overload)
SmartSerialPort.FRAMEDATAREADSTATUS ReadQueue(out string stringRead)
(인자) out byte[] bytesRead : Byte[] 형식의 수신 데이터
(인자) out string stringRead : String 형식의 수신 데이터
(리턴값) SmartSerialPort.FRAMEDATAREADSTATUS
- EMPTY = 0 (수신 데이터없음)
- VALIDDATA = 1(수신 데이터 정상)
- FAILDATA = 2(수신 데이터 비정상)
GetCheckSum16Gen, GetCheckSum8Gen / GetCRC32Gen, GetCRC16Gen 각각의 메서드는 ErrorCode의 계산된 값을 ErrorCodeType(eCode)에 따라서 ASCII, UniCode 타입 등으로 리턴합니다.
※ SmartSerialPort에서 ErrorCode를 사용할 경우 위 함수들이 내부에서 호출되어 송/수신 데이터를 자동으로 검증하게 됩니다.
byte GetCheckSum8Gen(byte[] rawData) (+3 overloads)
ushort GetCheckSum16Gen(byte[] rawData) (+3 overloads)
ushort GetCRC16Gen(byte[] rawData) (+3 overloads)
uint GetCRC32Gen(byte[] rawData) (+3 overloads)
(인자) byte[] rawData : 바이트 배열 형식의 원본 데이터
(인자) int iStart : 데이터의 시작 지점을 설정
(인자) int iLength : 데이터의 길이를 설정
(인자) SmartSerialPort.CODETYPES eCode : 데이터의 타입이 ASCII 또는 Unicode인지 설정

GetCheckSum8Gen() 의 리턴값
(리턴값) byte : 데이터를 CheckSum 8Bit로 계산한 결과값
(리턴값) byte[]: eCode 인자값에 따른 ASCII 또는 Unicode 데이터

GetCheckSum16Gen() 의 리턴값
(리턴값) ushort : 데이터를 CheckSum 16Bit로 계산한 결과값
(리턴값) byte[] : eCode 인자값에 따른 ASCII 또는 Unicode 데이터

GetCRC16Gen() 의 리턴값
(리턴값) ushort : 데이터를 CRC 16Bit로 계산한 결과값
(리턴값) byte[]: eCode 인자값에 따른 ASCII 또는 Unicode 데이터

GetCRC32Gen() 의 리턴값
(리턴값) uint: 데이터를 CRC 32Bit로 계산한 결과값
(리턴값) byte[] : eCode 인자값에 따른 ASCII 또는 Unicode 데이터
ASCII Byte 배열을 문자열로 변환한다.
static string ConvertASCIIByteToString(byte[] byteData)
(인자) byte[] byteData : ASCII 바이트 배열 데이터
(리턴값) string : 문자로 변환된 데이터
UniCode Byte 배열을 문자열로 변환한다.
static string ConvertUnicodeByteToString(byte[] byteData)
(인자) byte[] byteData : UniCode 바이트 배열 데이터
(리턴값) string : 문자로 변환된 데이터


3. RS232 Block 특징

① RS232 Isolation Block으로 사용 가능한 포트번호가 IEC667/1000-Series는 COM4(TTL Level)입니다.
② 최대 데이터 송/수신 속도 19200 bps지원
③ Smart I/O-II, Smart I/O-III Series에서만 사용가능(Smart I/O-I에서 사용불가)
④ 전기적인 Isolation 처리지원

4. RS232 Block과 센서 결선 안내 4-1. 테스트 적합 센서 안내 및 RS232 Block과 센서 결선
케이블과 커넥터

• 테스트 적합한 모듈 : RS232 연장 케이블과 시리얼 9핀 커넥터(암놈)

4-2. Smart I/O - II 또는 Smart I/O - III에 RS232 Block 장착
Smart I/O - II 에 RS232 Block 장착(RS232 Block 부분)
Smart I/O - III에 RS232 Block 장착(D포트. D4~D7)


5. 예제 프로그램 동작 설명
예제프로그램

통신 환경 설정

① Port No는 COM1~COM4, COM7까지 사용이 가능하지만 RS232블록을 사용하는 경우 IEC266-Series는 COM1(TTL Level)만 지원하며 IEC667/1000-Series는 COM4(TTL Level)만 지원합니다.

② BaudRate 는 통신 속도(BaudRate)를 설정합니다. 110bps~115200bps까지 사용이 가능하지만 RS232 Block을 사용하는 경우 최대 19200bps까지 지원됩니다.

③ FrameStyle또는 NoneFrameStyle(Frame방식이 아님)을 선택가능 FrameStyle은 STXANDETX, STX Only, ETX Only 방식으로 구분합니다. STX와 ETX는 1Byte ~ 2Byte로 설정할 수 있습니다.

④ ReadTimeOut은 Frame형식의 경우 옵션(Option)이고 NoneFrame 형식의 경우 필수입니다. 읽기 작업의 타임아웃 시간 설정 및 None-Frame 구조에서 Data의 구분을 하기위하여 통신 환경에 적절한 값으로 설정합니다.

⑤ ErrorCode Location 은 ErrorCheckMode에 의해 설정된 Error Check Code의 프레임에서의 위치(Head 또는 Tail)를 지정합니다.

⑥ ErrorCode Mode는 데이터를 송/수신 시 Error Check를 사용할지 설정합니다. SmartSerialPort는 내부에 Error Check를 자동으로 수행 하도록 구현되어 있습니다. 종류는 NONE, CHECKSUM8, CHECKSUM16, CRC16, CRC32가 있습니다.

⑦ ReceiveFrameDebugMode는 수신 관련 함수에서 FrameData의 전체(STX, ETX, ErrorCode)를 출력하거나 Data만 출력을 원할 때 설정합니다. True는 FrameData 전체 출력, False는 데이터만 출력(Default) 합니다. 체크박스를 체크하는 경우 True입니다.

시리얼 포트(SerialPort) OPEN

⑧ 시리얼 포트를 오픈 합니다. BaudRate(통신속도), PortNo(포트번호), ReadTimeOut(읽기 작업의 타임아웃 시간)이 미리 정해져야 합니다.

SerialPort 내용 송신

⑨ 바이트 형식(Binary), 텍스트 형식(Ascii, UniCode) 세가지 방식 중에 하나로 송신이 가능

SerialPort 내용 수신(Event 방식, Polling 방식)

⑩ 수신 방식은 Event 또는 Polling 중에 선택이 가능

⑪ 바이트 형식(Binary), 텍스트 형식(Ascii, UniCode) 세가지 방식 중에 하나로 수신이 가능하며 동일한 코드 형식으로 송/수신을 주고받아야 합니다.
Ex) Binary로 송신하는 경우 Binary로 수신하기 바랍니다.

⑫ 수신된 데이터는 SmartListBox의 상단에 수신된 시간 순서대로 추가됩니다.

시리얼 포트(SerialPort) CLOSE

⑬ Serial Port를 Close합니다.

C# 예제코드

소스코드는 참고 및 학습용으로 버그 및 여러가지 문제가 있을수 있습니다.


// 송/수신 데이터의 구조가 Frame과 NoneFrame에 따라 FrameSeparationType을 구분하여 설정
private void btnOpen_Click(object sender, EventArgs e)
{
// 선택한 인덱스를 저장
int iFrameSelect = cbFrameStyle.SelectItemIndex;
// ReadTimeout값 지정. (Frame은 Option / NoneFrame은 필수)
if (smartSerialPort1.IsOpen == false)
{
// STX, ETX를 저장할 바이트 배열
byte[] bSTX = new byte[2];
byte[] bETX = new byte[2];

// SmartSerialPort STX, ETX 초기화
smartSerialPort1.STXCodes = null;
smartSerialPort1.ETXCodes = null;

// STX, ETX를 변환하여 배열에 저장
bSTX[0] = Convert.ToByte(labSTX1.Text);
bSTX[1] = Convert.ToByte(labSTX2.Text);
bETX[0] = Convert.ToByte(labETX1.Text);
bETX[1] = Convert.ToByte(labETX2.Text);

switch (iFrameSelect)
{
case 0:
case 4:
// STX(1Byte), ETX(1Byte)를 사용하는 경우
smartSerialPort1.STXCode = bSTX[0];
smartSerialPort1.ETXCode = bETX[0];
break;
case 1:
case 5:
// STX(2Byte), ETX(1Byte)를 사용하는 경우
smartSerialPort1.STXCodes = bSTX;
smartSerialPort1.ETXCode = bETX[0];
break;
case 2:
case 6:
// STX(1Byte), ETX(2Byte)를 사용하는 경우
smartSerialPort1.STXCode = bSTX[0];
smartSerialPort1.ETXCodes = bETX;
break;
case 3:
case 7:
// STX(2Byte), ETX(2Byte)를 사용하는 경우
smartSerialPort1.STXCodes = bSTX;
smartSerialPort1.ETXCodes = bETX;
break;
case 8:
case 9:
// STX(1Byte)를 사용하는 경우
smartSerialPort1.STXCode = bSTX[0];
break;
case 10:
case 11:
// STX(2Byte)를 사용하는 경우
smartSerialPort1.STXCodes = bSTX;
break;
case 12:
case 13:
// ETX(1Byte)를 사용하는 경우
smartSerialPort1.ETXCode = bETX[0];
break;
case 14:
case 15:
// ETX(2Byte)를 사용하는 경우
smartSerialPort1.ETXCodes = bETX;
break;
}

// SmartComboBox로 선택한 Item에 따라 Baud_Rate 설정
smartSerialPort1.Baud_Rate = (SmartX.SmartSerialPort.BAUDRATE)(Convert.ToInt32(cbBaudRate.Text));

// Port번호 선택. RS232블럭을 사용하는 경우 IEC667/1000-Series는 COM4 포트만 사용 가능합니다.
if (radCOM1.Checked == true)
{
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM1;
}
else if (radCOM2.Checked == true)
{
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM2;
}
else if (radCOM3.Checked == true)
{
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM3;
}
else if (radCOM4.Checked == true)
{
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM4;
}
else
{
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM7;
}

if (radCOM4.Checked == false)
{
SmartX.SmartMessageBox.Show("RS232 Block을 사용하는 경우 IEC667/1000은 COM4 포트만 사용할 수 있습니다.");
}

// Error Check Mode
if (radNone.Checked == true)
{
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.NONE;
}
else if (radCheckSum8.Checked == true)
{
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CHECKSUM8;
}
else if (radCheckSum16.Checked == true)
{
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CHECKSUM16;
}
else if (radCRC16.Checked == true)
{
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CRC16;
}
else
{
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CRC32;
}

// ErrorCodeLocation
if (radHead.Checked == true)
{
smartSerialPort1.ErrorCode_Location = SmartX.SmartSerialPort.ERRORCODELOCATION.HEADER;
}
else
{
smartSerialPort1.ErrorCode_Location = SmartX.SmartSerialPort.ERRORCODELOCATION.TAIL;
}

if (radEvent.Checked == true)
{
smartSerialPort1.ReceiveDetect = SmartX.SmartSerialPort.RECEIVEDETECTTYPE.EVENT_QUEUE;
}
else
{
smartSerialPort1.ReceiveDetect = SmartX.SmartSerialPort.RECEIVEDETECTTYPE.POLLING_NONEQUEUE;
}

// ReadTimeout 설정 (ReadTimeout을 사용하는 FrameType의 경우 반드시 설정해야 합니다.)
smartSerialPort1.ReadTimeout = Convert.ToInt32(udReadTimeOut.Value);
// Frame의 BufferSize를 설정
smartSerialPort1.FrameBufferSize = Convert.ToUInt32(udBufferSize.Value);
// ReceiveFrameDebugMode 설정 (True는 FrameData[STX+Data+ErrorCheckCode+ETX] 송/수신, False는 Data만 송/수신)
smartSerialPort1.ReceiveFrameDebugMode = chkDebugMode.Checked;
smartSerialPort1.RS485SoftwareDetection = false;

// Port가 열려있지 않다면 Port를 Open합니다.
if (smartSerialPort1.IsOpen == false)
{
smartSerialPort1.Open();
labStatus.Text = "SerialPort Opened";
}
}
}

// 데이터 전송(SmartTimer 사용)
private void smartTimer1_Tick(object sender, EventArgs e)
{
// Frame Style에 따른 Send Method 분류
// 1. NoneFrame-Event / 2. NoneFrame-Polling
if (smartSerialPort1.FrameSeparationType == SmartX.SmartSerialPort.FRAMESEPARATIONTYPES.NONEFRAME_READTIMEOUT)
{
if (radSendToAscii.Checked == true)
{
smartSerialPort1.WriteNoneFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.ASCIICODE);
}
else if (radSendToUniCode.Checked == true)
{
smartSerialPort1.WriteNoneFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.UNICODE);
}
else if (radSendToBinary.Checked == true)
{
// 문자열 --> Byte[] 변환후 전송
byte[] bByteArray = Encoding.UTF8.GetBytes(labSendData.Text);
smartSerialPort1.WriteNoneFrame(bByteArray);
}
}

// 3. Frame-Event / 4. Frame-Polling
else
{
if (radSendToAscii.Checked == true)
{
smartSerialPort1.WriteFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.ASCIICODE);
}
else if (radSendToUniCode.Checked == true)
{
smartSerialPort1.WriteFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.UNICODE);
}
else if (radSendToBinary.Checked == true)
{
// 문자열 --> Byte[] 변환후 전송
byte[] bByteArray = Encoding.UTF8.GetBytes(labSendData.Text);
smartSerialPort1.WriteFrame(bByteArray);
}
}

if (chkSendRept.Checked == false)
{
smartTimer1.Stop();
}
}

// 데이터 수신(Event 수신 방식)
private void smartSerialPort1_OnReadQueueEvent()
{
// Event 수신방식일 경우에만 동작
if (radEvent.Checked == true)
{
string strData = "";
byte[] readByte;
SmartX.SmartSerialPort.FRAMEDATAREADSTATUS eStatus;

// 1. Frame / 2. NoneFrame
eStatus = smartSerialPort1.ReadQueue(out readByte);

// ASCII, UniCode, Binary방식에따라 구분
if (radRecvAscii.Checked == true)
{
strData = SmartX.SmartSerialPort.ConvertAsciiByteToString(readByte);
}
else if (radRecvUnicode.Checked == true)
{
strData = SmartX.SmartSerialPort.ConvertUnicodeByteToString(readByte);
}
else
{
// 수신된 프레임 데이터를 각각의 바이트를 16진수로 표시 합니다
for (int i = 0; i < readByte.Length; i++)
{
strData += string.Format(" {0:X2}", readByte[i]);
}
}
}

// ListBox에 데이터 삽입
if (eStatus == SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY)
{
lstRecvData.AddItem("EMPTY");
}
else if (eStatus == SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.FAILDATA)
{
lstRecvData.AddItem("Fail");
}
else
{
lstRecvData.AddItem(strData);
}
}

// 데이터 수신(Polling 수신 방식)
private void btnRecvPolling_Click(object sender, EventArgs e)
{
string strData = null;
byte[] readByte = new byte[10];
SmartX.SmartSerialPort.FRAMEDATAREADSTATUS eStatus = SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY;

// 1. NoneFrame
if (smartSerialPort1.FrameSeparationType == SmartX.SmartSerialPort.FRAMESEPARATIONTYPES.NONEFRAME_READTIMEOUT)
{
eStatus = smartSerialPort1.ReadNoneFrame(out readByte, 1000);
}
// 2. Frame
else
{
eStatus = smartSerialPort1.ReadFrame(out readByte);
}

// ListBox에 데이터 삽입
if (eStatus == SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY)
{
lstRecvData.AddItem("EMPTY");
}
else if (eStatus == SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.FAILDATA)
{
lstRecvData.AddItem("Fail");
}
else
{
// ASCII, UniCode, Binary방식에따라 구분
if (radRecvAscii.Checked == true)
{
strData = SmartX.SmartSerialPort.ConvertAsciiByteToString(readByte);
}
else if (radRecvUnicode.Checked == true)
{
strData = SmartX.SmartSerialPort.ConvertUnicodeByteToString(readByte);
}
else
{
// 수신된 프레임 데이터를 각각의 바이트를 16진수로 표시 합니다
for (int i = 0; i < readByte.Length; i++)
{
strData += string.Format(" {0:X2}", readByte[i]);
}
}
lstRecvData.AddItem(strData);
}
}

VB.NET 예제코드

소스코드는 참고 및 학습용으로 버그 및 여러가지 문제가 있을수 있습니다.

' 송/수신 데이터의 구조가 Frame과 NoneFrame에 따라 FrameSeparationType을 구분하여 설정
Private Sub btnOpen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnOpen.Click
' 선택한 인덱스를 저장
Dim iFrameSelect As Integer = cbFrameStyle.SelectItemIndex
' ReadTimeout값 지정. (Frame은 Option / NoneFrame은 필수)
If smartSerialPort1.IsOpen = False Then
' STX, ETX를 저장할 바이트 배열
Dim bSTX As Byte() = New Byte(1) {}
Dim bETX As Byte() = New Byte(1) {}

' SmartSerialPort STX, ETX 초기화
smartSerialPort1.STXCodes = Nothing
smartSerialPort1.ETXCodes = Nothing

' STX, ETX를 변환하여 배열에 저장
bSTX(0) = Convert.ToByte(labSTX1.Text)
bSTX(1) = Convert.ToByte(labSTX2.Text)
bETX(0) = Convert.ToByte(labETX1.Text)
bETX(1) = Convert.ToByte(labETX2.Text)

Select Case iFrameSelect
Case 0, 4
' STX(1Byte), ETX(1Byte)를 사용하는 경우
smartSerialPort1.STXCode = bSTX(0)
smartSerialPort1.ETXCode = bETX(0)
Case 1, 5
' STX(2Byte), ETX(1Byte)를 사용하는 경우
smartSerialPort1.STXCodes = bSTX
smartSerialPort1.ETXCode = bETX(0)
Case 2, 6
' STX(1Byte), ETX(2Byte)를 사용하는 경우
smartSerialPort1.STXCode = bSTX(0)
smartSerialPort1.ETXCodes = bETX
Case 3, 7
' STX(2Byte), ETX(2Byte)를 사용하는 경우
smartSerialPort1.STXCodes = bSTX
smartSerialPort1.ETXCodes = bETX
Case 8, 9
' STX(1Byte)를 사용하는 경우
smartSerialPort1.STXCode = bSTX(0)
Case 10, 11
' STX(2Byte)를 사용하는 경우
smartSerialPort1.STXCodes = bSTX
Case 12, 13
' ETX(1Byte)를 사용하는 경우
smartSerialPort1.ETXCode = bETX(0)
Case 14, 15
' ETX(2Byte)를 사용하는 경우
smartSerialPort1.ETXCodes = bETX
End Select

' SmartComboBox로 선택한 Item에 따라 Baud_Rate 설정
smartSerialPort1.Baud_Rate = CType((Convert.ToInt32(cbBaudRate.Text)), SmartX.SmartSerialPort.BAUDRATE)

' Port번호 선택. RS232블럭을 사용하는 경우 IEC667/1000-Series는 COM4 포트만 사용 가능합니다.
If radCOM1.Checked = True Then
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM1
ElseIf radCOM2.Checked = True Then
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM2
ElseIf radCOM3.Checked = True Then
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM3
ElseIf radCOM4.Checked = True Then
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM4
Else
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM7
End If

If radCOM4.Checked = False Then
SmartX.SmartMessageBox.Show("RS232 Block을 사용하는 경우 IEC667/1000은 COM4 포트만 사용할 수 있습니다.")
End If

' Error Check Mode
If radNone.Checked = True Then
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.NONE
ElseIf radCheckSum8.Checked = True Then
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CHECKSUM8
ElseIf radCheckSum16.Checked = True Then
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CHECKSUM16
ElseIf radCRC16.Checked = True Then
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CRC16
Else
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.CRC32
End If

' ErrorCodeLocation
If radHead.Checked = True Then
smartSerialPort1.ErrorCode_Location = SmartX.SmartSerialPort.ERRORCODELOCATION.HEADER
Else
smartSerialPort1.ErrorCode_Location = SmartX.SmartSerialPort.ERRORCODELOCATION.TAIL
End If

If radEvent.Checked = True Then
smartSerialPort1.ReceiveDetect = SmartX.SmartSerialPort.RECEIVEDETECTTYPE.EVENT_QUEUE
Else
smartSerialPort1.ReceiveDetect = SmartX.SmartSerialPort.RECEIVEDETECTTYPE.POLLING_NONEQUEUE
End If

' ReadTimeout 설정 (ReadTimeout을 사용하는 FrameType의 경우 반드시 설정해야 합니다.
smartSerialPort1.ReadTimeout = Convert.ToInt32(udReadTimeOut.Value)
' Frame의 BufferSize를 설정
smartSerialPort1.FrameBufferSize = Convert.ToUInt32(udBufferSize.Value)
' ReceiveFrameDebugMode 설정 (True는 FrameData[STX+Data+ErrorCheckCode+ETX] 송/수신, False는 Data만 송/수신)
smartSerialPort1.ReceiveFrameDebugMode = chkDebugMode.Checked
smartSerialPort1.RS485SoftwareDetection = False

' Port가 열려있지 않다면 Port를 Open합니다.
If smartSerialPort1.IsOpen = False Then
smartSerialPort1.Open()
labStatus.Text = "SerialPort Opened"
End If
End If
End Sub

' 데이터 전송(Timer 사용)
Private Sub smartTimer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles SmartTimer1.Tick
' Frame Style에 따른 Send Method 분류
' 1. NoneFrame-Event / 2. NoneFrame-Polling
If smartSerialPort1.FrameSeparationType = SmartX.SmartSerialPort.FRAMESEPARATIONTYPES.NONEFRAME_READTIMEOUT Then
If radSendToAscii.Checked = True Then
smartSerialPort1.WriteNoneFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.ASCIICODE)
ElseIf radSendToUniCode.Checked = True Then
smartSerialPort1.WriteNoneFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.UNICODE)
ElseIf radSendToBinary.Checked = True Then
' 문자열 --> Byte[] 변환후 전송
Dim bByteArray As Byte() = Encoding.UTF8.GetBytes(labSendData.Text)
smartSerialPort1.WriteNoneFrame(bByteArray)
End If
' 3. Frame-Event / 4. Frame-Polling
Else
If radSendToAscii.Checked = True Then
smartSerialPort1.WriteFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.ASCIICODE)
ElseIf radSendToUniCode.Checked = True Then
smartSerialPort1.WriteFrame(labSendData.Text, SmartX.SmartSerialPort.CODETYPES.UNICODE)
ElseIf radSendToBinary.Checked = True Then
' 문자열 --> Byte[] 변환후 전송
Dim bByteArray As Byte() = Encoding.UTF8.GetBytes(labSendData.Text)
smartSerialPort1.WriteFrame(bByteArray)
End If
End If

If chkSendRept.Checked = False Then
smartTimer1.Stop()
End If
End Sub

' 데이터 수신(Event 수신 방식)
Private Sub SmartSerialPort1_OnReadQueueEvent() Handles SmartSerialPort1.OnReadQueueEvent
' Event 수신방식일 경우에만 동작
If radEvent.Checked = True Then
Dim strData As String = ""
Dim readByte As Byte()
Dim eStatus As SmartX.SmartSerialPort.FRAMEDATAREADSTATUS

' 1. Frame / 2. NoneFrame
eStatus = smartSerialPort1.ReadQueue(readByte)

' ASCII, UniCode, Binary방식에따라 구분
If radRecvAscii.Checked = True Then
strData = SmartX.SmartSerialPort.ConvertAsciiByteToString(readByte)
ElseIf radRecvUnicode.Checked = True Then
strData = SmartX.SmartSerialPort.ConvertUnicodeByteToString(readByte)
Else
' 수신된 프레임 데이터를 각각의 바이트를 16진수로 표시 합니다
For i As Integer = 0 To readByte.Length - 1
strData += String.Format(" {0:X2}", readByte(i))
Next
End If
End If

' ListBox에 데이터 삽입
If eStatus = SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY Then
lstRecvData.AddItem("EMPTY")
ElseIf eStatus = SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.FAILDATA Then
lstRecvData.AddItem("Fail")
Else
lstRecvData.AddItem(strData)
End If
End Sub

' 데이터 수신(Polling 수신 방식)
' // 수신부분. // 1. Frame-Polling // 2. NoneFrame-Polling
Private Sub btnRecvPolling_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRecvPolling.Click
Dim strData As String = Nothing
Dim readByte As Byte() = New Byte(9) {}
Dim eStatus As SmartX.SmartSerialPort.FRAMEDATAREADSTATUS = SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY

If smartSerialPort1.FrameSeparationType = SmartX.SmartSerialPort.FRAMESEPARATIONTYPES.NONEFRAME_READTIMEOUT Then
eStatus = smartSerialPort1.ReadNoneFrame(readByte, 1000)
Else
eStatus = smartSerialPort1.ReadFrame(readByte)
End If

If eStatus = SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY Then
lstRecvData.AddItem("EMPTY")
ElseIf eStatus = SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.FAILDATA Then
lstRecvData.AddItem("Fail")
Else
If radRecvAscii.Checked = True Then
strData = SmartX.SmartSerialPort.ConvertAsciiByteToString(readByte)
ElseIf radRecvUnicode.Checked = True Then
strData = SmartX.SmartSerialPort.ConvertUnicodeByteToString(readByte)
Else
For i As Integer = 0 To readByte.Length - 1
strData += String.Format(" {0:X2}", readByte(i))
Next
End If
lstRecvData.AddItem(strData)
End If
End Sub
맨 위로
팝업닫기

(주)에이치앤에스('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