rfid 장비(서버)에 ip와 port를 이용해 연결하면, 응답메시지가 전달되고 이를 잘 받았습니다.
그리고 클라이언트 측 프로그램에서 가변 데이터를 표준 규격에 맞게 보내면 응답메시지가 오는 것이 정상인데,
idTcpClient_1.WriteBuffer() 메소드를 쓰려고 하는데 맞는지요.
type
TByteArray = array of Byte;
function LLRP_IMPINJ_ENABLE_EXTENSIONS(): TByteArray;
var
vData: TByteArray;
begin
SetLength(vData, 19);
vData[0] := 7; vData[1] := 255; vData[2] := 0;
vData[3] := 0; vData[4] := 0; vData[5] := Length(vData);
vData[6] := 33; vData[7] := 34; vData[8] := 35;
vData[9] := 36; vData[10] := 0; vData[11] := 0;
vData[12] := 101; vData[13] := 26; vData[14] := 21;
vData[15] := 0; vData[16] := 0; vData[17] := 0;
vData[18] := 0;
Result := vData;
end;
procedure TForm1.tmr_StartTimer(Sender: TObject);
var
vData: TByteArray;
nCount, nUse, nAnt, i: Byte;
strVData, strAnt: String;
begin
nCount := 0;
tmr_Start.Enabled := False;
strVData := '';
case m_nIndex of
10:
begin
vData := LLRP_IMPINJ_ENABLE_EXTENSIONS();
end;
// 이하 생략......
else;
end;
// vData에 어떤 값이 들어있는지 미리 화면에 출력 준비
for i:=0 to Length(vData) - 1 do
if i=0 then
strVData := IntToStr(vData[i])
else
strVData := strVData + ', ' + IntToStr(vData[i]);
///// 출력 ////////////////////
mm_ConnInfo.Lines.Add('[S] L(' + IntToStr(Length(vData)) + ') ' + strVData);
if m_nIndex = 40 then
begin
bbtn_Start.Enabled := False;
tmr_Start.Enabled := False;
Exit;
end;
m_nIndex := m_nIndex + 10;
Buff_Count:= vData[5];
////////// 데이터 송신 ////////////////////
idTcpClient_1.WriteBuffer(vData, Length(vData)); // ◀◀◀ 바이트(배열)로 데이터를 송신 (가변임)
tmr_Start.Enabled := True;
end;
응답메시지를 처리하는 부분은 쓰레드로 처리하기 때문에 정상이라 생각합니다. 처음에 ip와 port 연결을 시도할 때 서버(장비)로부터 데이터를 한번 수신받게 됩니다. 그래서 접속만 하고 바로 리시브 값을 받아 출력은 해놓은 상태입니다.(스레드)
값을 전송하고 응답 메시지가 있다면 이를 처리해야할 터인데 그렇지 못하고 바로 다음 두번째 값(케이스 문에서 10말고 20부터 또 vData 세팅을 함)을 전송하려 하는게 문제이고, 이때, WriteBuffer() 의 두번째 파라미터 값(사이즈)에 의해 소켓 에러 메시지가 뜹니다. Socket Error #10054 입니다.
조언 부탁드립니다~~
|