|
해결이 다 되었을지 모르겠지만...
제어문자에 대해 조금 도움이 되고 싶어 답변드립니다.
그리고, 이런 충고(?)를 드려도 되는지... 모르겠지만...
중요한것은 spec.에 대해 확실한 이해가 필요하다는 것입니다.
프로토콜은 정상적인 경우에외 비정상적인 경우에 대한 대비도 무지
중요하기때문에 정확해야 합니다.(절대 추측 금물!!!)
ASCII code의 0x20 미만의 값은 물리계층으로 접속하는 장비에서
제어문자로 많이 사용하고 있습니다.
그래서, 데이터 통신에서 대부분의 프로토콜은 실제의 데이터에는
되도록 0x20 미만의 값을 갖지않도록 하고 있습니다.
각 값에 해당되는 제어문자의 의미는 아래와 같습니다.
Dec Hex Char 의미(내용) | Dec Hex Char 의미(내용)
------------------------------------+--------------------------
0 0x00 NULL null | 16 0x10 DLE Data Link Escape
1 0x01 SOH Start Of Heading | 17 0x11 DC1 Device Control 1
2 0x02 STX Start Of Text | 18 0x12 DC2 Device Control 2
3 0x03 ETX End Of Text | 19 0x13 DC3 Device Control 3
4 0x04 EOT End Of Transmission | 20 0x14 DC4 Device Control 4
5 0x05 ENQ ENQuiry | 21 0x15 NAK Negative AcKnowledge
6 0x06 ACK ACKnowledge | 22 0x16 SYN SYNchronous idle
7 0x07 BEL BELl | 23 0x17 ETB End of Trans, Block
8 0x08 BS BackSpace | 24 0x18 CAN CANcel
9 0x09 TAB horizontal TAB | 25 0x19 EM End of Medium
10 0x0A LF LineFeed / new line | 26 0x1A SUB SUBstitute
11 0x0B VT Vertical Tab | 27 0x1B ESC ESCape
12 0x0C FF FormFeed / new page | 28 0x1C FS File Separator
13 0x0D CR Carriage Return | 29 0x1D GS Group Separator
14 0x0E SO Shift Out | 30 0x1E RS Record Separator
15 0x0F SI Shift In | 31 0x1F US Unit Separator
이 제어문자들은 각 장비에서 데이터를 주고 받을 때 유용하게 응용되며,
특히 몇 문자들이 많이 사용됩니다.
이 제어문자를 이용한 프로토콜에 대해 간단하게 예를 들면
장비1 ---------- 장비2(또는 server 또는 HOST...)
call ---------> connection
<--------- 0x05(ENQ) : 데이터를 보내도 좋다는 의미로...
데이터 --------->
<--------- 0x06(ACK) : 정상적인 데이터 받았다는 의미로...
/ 0x15(NAK) : 비정상적인 데이터...
0x04(EOT) ---------> disconnect
: 데이터 전송 완료, 종료하자는 의미로...
disconnect
여기서 데이터 형식은 "0x02(STX) + 실제데이터 + 0x03(ETX) + check sum"
Format을 많이 사용하고 실제데이터가 많은 경우 경우에 따라 FS/GS/DLE...
등으로 데이터 구분을 하기도 합니다.
제어문자에 설명이 되었지만, 다시 한 번 설명드리면..
STX는 text(실제데이터)의 시작을 ETX는 text의 끝을 표현합니다.
그리고 check sum은 장비에 따라 LRC/CRC 방식등 여러 종류가 있으므로
당연히 방식을 확인해야 하구요...
그럼, 남은 하루도 좋은 시간되세요~
요쿠르트 님이 쓰신 글 :
: STX에 관한 궁금증 조금은 풀렸음다..^^*
:
: 근데요..
: 아직 ENQ <-> ACK 이 부분은 잘 이해가 안되거든요...
:
: 가령 제가 지금 쓰는 프로토콜이 ademco high라는 건데..
: 포멧이
: 8RRLAAAAsCCCCsCCCCsC[DC4] 거든요..
: 8 = Protocol number / RR = Receiver number
: L = Line number / AAAA = Accout code
: s = Space / CCCC = Channel 1-4
: s = Space / CCCC = Channel 5-8
: s = Space / C = Channel 9
: [DC4] = Terminator
:
: 이중에서 제가 추출해서 쓰는건 RR, AAAA, CCCC, CCCC, C 고요..
:
: 그럼 여기서 8(Protocol number) 부분이 STX란 말인가요? 아님 STX같은 역활이라서..
: if(buffer[0] == 0x08) 뭐 이렇게 체크해야하는 건가요?
:
: 그리고 여기서 ETX역활을 하는게 [DC4]가 되는 건가요?
: 근데 [DC4]는 어떻게 확인하죠?
: if(buffer[i] == [DC4]) 이렇게 하는건가요?(설마 아니죠?--?)
:
: 그리고 위의 프로토콜이라면..
: 확인 메세지는 어떤형식으로 보내야하는건가요??
|