본문 바로가기

Delphi

통신데이터 STX,ETX 체크

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;