Q&A

  • RS232에서 되는데 RS485에서는 안되는 것이----
델파이의 Asyncpro 컴포넌트로 시리얼통신을 하는

프로그램을 작성했는데

RS232케이블로는 정상적으로 통신하는데

RS485converter를 이용해서 RTS를 제어하려고 했더니

전혀 작동하지 않습니다.



Property 중에 RS485Mode가 도움말을 보면 자동으로 RTS를 제어해준다고 나와

있지만 실제로 되지 않네요!!



델파이로 처음 프로그램하는 것이라 힘드네요!!!

도움을 주셨으면 ----





// 수신할 때

procedure TfrmSerial.ApdComTriggerAvail(CP: TObject; Count: Word);

var

idx : integer;

tmpStr : string;



begin

tmpStr := '';



// ApdCom.RTS := Fasle; <-- RTS제어(안됨)



for idx:=1 to Count do tmpStr := tmpStr + ApdCom.GetChar;



Debug( 'PK :', tmpStr, True); // Debugging



m_RxString := m_RxString + tmpStr; // 데이타를 쌓는다.



// Gabbage Data가 들어오면 무조건 날림

if Length(m_RxString) < 7 then

begin

Exit; // 데이터가 쪼개졌으므로 다시 대기한다.

end;



// 데이타를 축출하고 그에 해당하는 작업을 수행한다.

if Length(m_RxString) = (Sizeof(TAnswer) + 1) then // 응답패킷에 CRC를 더한 길이

begin

// Sync가 맞으면 패킷을 처리한다.

if ((m_RxString[1] = SYNC_FIRST) and (m_RxString[2] = SYNC_SECOND))

and (m_RxString[3] = SYNC_THIRD) then

begin

// 프로토콜을 분석하여 처리한다(여기서 통신의 처리가 됨)

TranslatePacket( m_RxString );



m_RxString := ''; // 패킷처리를 했으므로 버퍼를 비움



// 전송과 관련된 타이머

if bActivate then // 통신폼이 활성화되었을 때만 가능

begin

tmrInterval.Enabled := True; // 재전송을 검토한다.

end else

begin

frmMain.tmrProcess.Enabled := True; // 메인의 이벤트일 경우

end;

end else

begin

Debug( 'PK :', m_RxString, True); // Debugging

m_RxString := '';

end;

end else

begin // 7보다 큰 패킷은

Debug( 'PK :', m_RxString, True); // Debugging

m_RxString := ''; // Gabbage Data이므로 버퍼를 비움

end;



// Overflow 확인

if OVERFLOW_SIZE <= Length(m_RxString) then m_RxString := '';



end;



// 송신할 때

procedure TfrmSerial.Send( vData: string );

var

Packet : string;



begin

Packet := '';



Packet := Packet + vData;



// RX485 제어를 위해 RTS(제어문자를 붙임) <-- RTS를 제어하고자

// Packet := ApdCom.XOnChar + Packet + ApdCom.XOffChar; 했지만 안됨

// ApdCom.RTS := True;



if Length(Packet) <= ApdCom.OutBuffFree then

begin



ApdCom.PutString( Packet );

// 시험용 - 통신관리자에서 전송시

if bActivate then Debug( 'TX :', Packet, True)

// 실제용 - 메임폼에서 전송시

else Debug( 'TX :', Packet, True);

end;

// ApdCom.RTS := Fasle;

end;





0  COMMENTS