Q&A

  • 시리얼(rs232) 아래꺼 질문입니다.
////////// 메인폼 /////////////////
unit Unit1;
~
  public
    { Public declarations }
    RxCount:integer;
    v:string;
    i:integer;
    ModalFormCheck:integer;
  end;
~
uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  
  ModalFormCheck:=1;
  Form2:=Tform2.Create(application);
  Form2.showmodal;
  Form2.Free;
end;

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
  v:=' ';
  ComPort1.ReadStr(v,count);
  if (v <>'  ')and(ModalFormCheck=0) then   // 모달폼이 안열렸을때와
                                                              //시리얼 RX 가 발생하면
  begin
    Form1.Button1Click(sender);            
  end;
  RxCount:=RxCount+1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  fchk:=0;
  kk:=0;
  i:=0;
  ComPort1.Connected:=true;
  timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   i:=i+1;
end;
end.
//////////// 모달폼 //////////////
unit Unit2;
~
  public

    { Public declarations }
    tt:integer;
  end;

var
  Form2: TForm2;
  ff:string;
implementation
uses Unit1;

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  timer2.Enabled:=true;
  form1.v:=' ';
  label1.Caption:=inttostr(form1.i);
  tt:=0;
end;

procedure TForm2.Timer2Timer(Sender: TObject);
begin
label2.Caption:=inttostr(form1.i);
label3.Caption:=form1.RxCount;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  form1.ModalFormCheck:=0;
end;
end.
//////////////////////////////////

프로그램의 모든 선택은 시리얼 이벤트에 의해서 하려고 합니다.
메인폼에서 시리얼 이벤트로 모달폼을 열고 다시 모달폼에서
시리얼 이벤트로 다른 것들을 선택하는 것입니다.
시리얼 컴포넌트는 메인폼에만 하나 있습니다.

그런데 시리얼 이벤트 걸면 메인폼의 시리얼 값인 v 가
버튼1(메인폼)으로 직접 모달폼을 열때는 들어 와서 RxCount가 모달폼에서
보면 증가하는것을 볼 수 있습니다.
그런데 이벤트(TForm1.ComPort1RxChar)에 의해서 모달폼이 호출되면
이상하게 처음에 값만 모달폼에서 보이고 RxCount값이 증가하지 않습니다.

원래 프로그램을 그대로 올릴수 없어서 필요한 부분만 test로 만들어서
올립니다.
답변 부탁드립니다. 고생 많이 했는데 안되네여..
1  COMMENTS
  • Profile
    하늘 산 2005.01.15 19:42
    시리얼 통신이나 다른 퉁신을 쓰더라도 장비와 통신을 할때에는 정확히 스트링이 전부 전달이 되었는지 전달 받았는지가 중요합니다.
    어쩔땐 한 명령어에 한스트링의 응답도 두번에 걸처 시리얼 버퍼에 스트링이 쌓이기도 합니다.

    그래서 스트링을 받는 이벤트에서 시리얼 포트를 무리하게 닫는 것보다는
    어떤 한곳에서 체크를 해주는 편이 좋습니다.

    또한 RX 이벤트는 아래와 같이 하시면 여러번 발생할수 있으므로 모달폼이 제대로 작동하지 않을 수 있습니다.

    응답에 대한 스트링을 세밀한 검사가 첫번째이구요.
    만약 스트링이 정확하다면 시리얼 포트를 우선 닫고 작업을 하셔야합니다.
    그렇지 않으면 계속해서 이벤트가 발생할겁니다.

    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    begin
      v:=' ';
      ComPort1.ReadStr(v,count);
      if (v <>'  ')and(ModalFormCheck=0) then   // 모달폼이 안열렸을때와
                                                                  //시리얼 RX 가 발생하면
      begin
        Form1.ComPort1.Close;//컴포넌트마다 포트를 닫는 명령은 조금씩다름.
        Form1.Button1Click(sender);            
      end;
      RxCount:=RxCount+1;
    end;

    그럼 즐코하세요.