1. STX ABCDEFG ETX STX HIJKLMN ETX 순으로 데이터 붙어서 입력시
2. 또는
STX ABCDE
FG ETX순서로 데이터 떨어져서 입력시
값을 버리지 않고 누적하여 STX부터 ETX 까지 데이터 살리기
단점 : 한프레임 데이터 길이중 STX가 3개 이상일 경우 반복문으로 POS 찾아서 돌려야 합니다.
현재 로직은 실제 장비에서 STX가 3번 이상 나오지 않아서 처리한 것입니다.
단점일때의 프레임 순서 : STX ABCDEFG ETX STX HIJKLMN ETX STX OPQRSTU ETX 일경우 반복으로 STX위치값을
이동시키면서 ETX까지 확인해야 합니다.
소켓 이벤트 에서 데이터 받아서 함수 호출
s := fMainForm.so.Socket.ReceiveText; //버퍼에서 데이터 입력 확인하여 변수에 임시 저장후, 밑의 함수로 STX,ETX 체크
if (fun_ReceiveEndYsno(s, rHOST.sRecvBuffer) = False) then // 함수 호출 . STX ETX 찾기
//STX,ETX 함수 선언부
function fun_ReceiveEndYsno(sReceive: String; var sRecvEnd: String): Boolean;
var
i: Integer;
s: String;
begin
sRecvEnd := '';
rHOST.sRecvNotEnd := rHOST.sRecvNotEnd + sReceive; //rHOST.sRecvNotEnd 전역변수
if POS(STX,rHOST.sRecvNotEnd) = 0 then //현재 프레임에서 STX 찾기,없을경우 버림
begin
sRecvEnd := '';
Result := False;
Exit;
end
else
begin
if ((POS(ETX,rHOST.sRecvNotEnd) > 0 ) AND (LENGTH(rHOST.sRecvNotEnd) > 2)) THEN //STX찾고 ETX있는지 확인
begin
//ETX있을경우 ,-> STX 부터 ETX까지 데이터 인정하고 선언 변수로 반환
sRecvEnd := COPY(rHOST.sRecvNotEnd,POS(STX,rHOST.sRecvNotEnd),POS(ETX,rHOST.sRecvNotEnd));
//ETX다음 바로 STX가 따라 들어왔는지 확인
if copy(rHOST.sRecvNotEnd,(POS(ETX,rHOST.sRecvNotEnd)+1),1) = STX then
begin
rHOST.sRecvNotEnd := ''; //STX가 바로 따라오면 전역변수 초기화후 STX부터 총 데이터 길이까지 변수에 저장
rHOST.sRecvNotEnd := COPY(sReceive, (POS(ETX,sReceive)+1),LENGTH(sReceive));
end;
Result := True;
Exit;
end
else
begin
//STX찾고 ETX 못찾을경우 전역변수에 STX부터 데이터 길이까지 저장하고 다음 데이터 RECIVE까지 보관
rHOST.sRecvNotEnd := COPY(rHOST.sRecvNotEnd,POS(STX,rHOST.sRecvNotEnd),LENGTH(rHOST.sRecvNotEnd));
Result := False;
Exit;
end;
end;
end;
'Delphi' 카테고리의 다른 글
OPC 통신 데이터 읽기 Delphi 버전 (0) | 2014.05.09 |
---|---|
변수나 레코드 변수를 파일하나에서 관리하는 방법 (0) | 2013.12.11 |
외부 프로그램 찾아서 현재 프로그램의 판넬 안으로 넣어버리기 (0) | 2013.12.11 |
현재 프로그램에서 외부 프로그램 찾아서 이벤트 실행하기 (0) | 2013.12.11 |
기본 Ado 연결,해제,테이블 업데이트 (0) | 2013.12.02 |