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
[26780] Re:STX, ACK 아직도 배가 고파요..--;
posix.duo [posix] 1324 읽음    2003-08-18 17:26
1. 통신 시작문자

통신 결과창에 나타나는 값은 통신 시작문자와 종료문자가 제외된 값이 나오는 경우가 많기 때문에
님께서 추측하신 것은 아닐 확률이 높습니다.(확실히 아니다라고는 정의 못함)

통신포맷을 정확하게 확인하고 싶으시면 상대측에서 송신하는 정보를 하나도 거르지 말고 모두 버퍼에
저장한 후 HEX코드 값으로 메모창 같은 곳에 뿌려보면 알 수 있으리라 봅니다.
일반적으로 사용자가 확인할 수 있도록 만들어놓은 통신프로그램은 통신 시작문자와 종료문자는
보여주지 않습니다. 내용만 보여주도록 하는게 일반적이죠.

그러므로 정확한 코드값을 확인하기 위해서는 매뉴얼을 보시든 위의 방법으로 확인하여야 합니다.
제 경우는 예전에 데이터 값중에 '0x02','0x03'등의 값이 포함되기 때문에 통신 시작문자와 종료문자를
'0x82', '0x83'으로 사용한 경우도 있었습니다. 프로그램 소스상에

#define STX    0x82
#define ETX    0x83

으로 정의하여 사용했기 때문에 소스만 보았을 경우 ASCII CODE의 이름대로 STX를 '0x02', ETX를 '0x03'
으로 인지하여 상대측에서 사용하였다면 물론 통신이 안되었을 겁니다. (응답쪽도 제가 프로그램 해서 그런
문제는 없었지만)


2. ENQ <-> ACK

ENQ(0x05)를 사용하는 대부분의 경우는 정상적인 경우 응답을 ACK(0x06)로 시작하는 응답을 하고
비정상적인 경우 응답을 NAK(0x15)로 하는 것이 일반적인 방법입니다. 따라서

    ENQ <-> ACK 는 정상적인 응답관계로 보고
    ENQ <-> NAK 는 정상적이지 않은 상황의 응답관계로 보면 됩니다.

3. [DC4]

이것은 종료문자가 아니라 제가 볼때는 데이터의 신빙성을 검증하는 Check Sum이 아닌가 생각됩니다.
전송된 문자열이 노이즈의 영향을 받았는지를 판단하기 위해서 통신 파라미터상에 Parity 검사를
사용하기도 하지만 그에 더하여 통신 시작문자의 다음 Byte로부터 Check Sum문자가 시작되기 전까지의
문자를 모두 SUM하여(SUM 방법은 여러가지가 있으므로 상대방의 계산 방법을 확인하여 동일한 방법으로
계산하여야 한다) 그 값을 넣어준 것이라 생각됩니다.

만약 이 값이 Check Sum일 경우에 통신 종료문자는 Check Sum 직전에 올 수도 있고 Check Sum 다음에
올 수도 있습니다.

그럼 이만...

요쿠르트 님이 쓰신 글 :
: 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 1324 2003/08/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.