C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[26804] Re:STX, ACK 아직도 배가 고파요..--;
즐겁게~ [sangsookk] 1942 읽음    2003-08-19 17:25
해결이 다 되었을지 모르겠지만...
제어문자에 대해 조금 도움이 되고 싶어 답변드립니다.

그리고, 이런 충고(?)를 드려도 되는지... 모르겠지만...
중요한것은 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]) 이렇게 하는건가요?(설마 아니죠?--?)
:
: 그리고 위의 프로토콜이라면..
: 확인 메세지는 어떤형식으로 보내야하는건가요??

+ -

관련 글 리스트
26777 STX, ACK 아직도 배가 고파요..--; 요쿠르트 816 2003/08/18
26804     Re:STX, ACK 아직도 배가 고파요..--; 즐겁게~ 1942 2003/08/19
26780     Re:STX, ACK 아직도 배가 고파요..--; posix.duo 1325 2003/08/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.