델파이의 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;