|
본문만 추려보자면
1. 시작구분자
1) NULL 또는 X
2. 종료구분자
2) C
제시하신 데이터예를 보았을때 시작구분자는
1) NULL 또는 X
2) 다음은 빈칸
정도로 생각되고요.
원하는 프로토콜만 추리는 방법은 만들기 나름이지만... 잘 만든 소스를 참고하셔도 되고요.
전 그냥 AnsiString으로 바꾼후 각 구분자위치를 찾아 Substring으로 추려버립니다.
어떤 장비는 항상 마지막 데이터만 취하면 되기에 최후에 완성된 프로토콜만 살리고요
어떤 장비는 날라온 데이터중 완성가능한 프로포콜을 모두 살리기도 합니다.
하드웨어적으로 버퍼를 가진 시리얼포트가 아니라면 별도의 버퍼를 만드셔도 편합니다.
포트에서 읽으면 일단 버퍼에 넣구요.
char Buffer[255];
어떤 방법이든 읽어온 데이터를 처음부터 모든 케릭터를 검사하여 시작구분자와 종료구분자를 찾아냅니다.
1. 최초 시작, 종료를 0으로 설정
2. 시작이 1, 종료가 14로 찾았으면 1~14까지 추리고... 시작과 종료는 15로 설정
3. 15부터 검색하여 시작이 15, 종료가 33으로 찾았으면 15~33까지 추리고... 시작과 종료는 34로 설정
4. 반복...
본문과 같이 길이도 일정치 않을땐 구분자의 규칙을 확실히 알아야 합니다.
특히 CD처럼 데이터를 종료구분자로 착각하면 안되죠.
보통 정상적 통신중이라면 종료와 시작구분자는 붙어옵니다.
CX @@@@@@@@CX @@@@C @@@@@@
하지만 한번 끊기거나 회선불량으로 짤려들어기 시작할때도 있습니다.
@@@@CX @@
@@@CX @@@@@@@@C
X @@@@@@@
경우의 수에 맞게 잘 구분하셔야 합니다.
추린 프로토콜은 StringList->Add로 쭉 추가하고 나중에 분석하면 되지요.
시리얼은 속도, 노이즈상태등에 따라 데이터가 외곡 or 끊겨버려서 오기 때문에 기다렸다가 정상적인 부분만 잘 추려야하죠.
럽투유 님이 쓰신 글 :
: RS232C 를 통하여 데이타를 추출하면 아래와 같이 나옵니다.
: 이것이 어느정도이 규칙성이 있는데 이를 규칙있게 잘라 배열로 넣고 싶은데..초보자라 쉽지가 안네요.
:
: 데이타는
: X AAABBBC AAAAEEECDEEC AAAWEWEWCX AAAAQQQQC
: 이렇습니다.
: 어디정도의 규칙성 이냐면...(보기 X나 힘드시죠?? ㅜㅜ)
:
: X AAABBBC
: Null값 이나 X로 처음시작하구요 마지막에 C로 끝납니다. 이게 하나의 배열로 넣고 싶습니다.
: AAABBB의 중간 값의 길이는 일정하지 않습니다.
: 또 중간에 "AAAAEEECDEEC" 처럼 CD 가 들어가는데 CD는 건너 띄워야 한다는거죠 ㅡㅡ; 마지막 값이 아니니까요.
:
: 어떻게 해야할까요?? 도와주시면 복 받으실 겁니다 ^^
|