Q&A

  • [질문] 일정한 시간간격으로 데이터를전송하면서 수신받고 싶을때
안녕하세요~
열심히 델파이 공부중인데요.. 어떻게 구현해야 할지 개념이 안잡혀서 문의드립니다.
전체 내용을 올릴려니 너무 방대해서 일단 간략하게 제가 구현하고 간략하게 나타내었습니다.

시스템  요약
일정한 시간간격으로 계속 상대방에게 어떠한 데이터를 전송하면서도 상대방에서 응답이 올때 문제없이 내용을 나타내고 싶습니다.

1. 송신시간 설정 (EDIT1에 입력)
2. 송신 버튼 클릭 (Button1을 클릭)
3. 상대편에서 응답 (Memo1 에 출력)


문의 1 : edit1에서 만약 10을 입력하면 10초마다 계속 반복해서 송신을 내보내고 싶습니다.
              여기서 쉽게 만약 10초마다 보내더라도 수신데이터는 1초만에 무조건 응답 가능해서
              송수신이 겹치는 일은 없다고 가정할때  어떻게 코딩하면 될까요??

타임밍 흐름:
    0초때 전송 -->
    1초때 데이터수신 ->
    10초때 전송 ->
    11초때 데이터수신 ->
    20초때 전송 ->
    21초때 데이터수신->
    ................




간략소스 (구현 내용 : 버턴 클릭시 한번 전송하고 수신받음.)



전송부분구현 // 'a'라는 데이터를 전송
procedure TForm1.BitBtn27Click(Sender: TObject);   // 송신 주기 온시 송신요청
  begin
    s := 'a';        
    comport1.Writestr(s);      //com포트1로 (s)를 보낸다.
  end;



수신부분 구현  .

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);         //수신받기
var
  i : integer;
  begin
      Timer1.Enabled := false;      
comport1.ReadStr(s,Count);      //컴포트1로 신호값을 받아오기
    for i :=1 to length(s) do
        begin
          Rcv := Rcv + s[i];   // 수신데이터s를 Rcv에 누적
          MemoSS := MemoSS + IntToHex(Byte(s[i]),2); // 메모에 보이기 위해서 아스키를 헥사로 만든다.
        end;
      Timer1.Enabled := True; //타이머 작동(수신데이터를 전부 더한후)
    end;   //begin


procedure TForm1.Timer1Timer(Sender: TObject);    

  // 타이머 사용안하니까 memo1에 8byte씩 들어오고 줄바꿈을 하길래 타이머를 사용함  
문의 2 : 타이머를 사용안해도 제대로 memo1에 한줄에 데이터가 다 들어오면 사용안했으면 좋겠어요
            어떻게 하면 될까요?


  begin
     memo1.Lines.add(MemoSS);  // 수신내용을 메모장에 헥사값을 뿌려준다.
   end;

1  COMMENTS
  • Profile
    박정순 2010.07.14 01:51
    타임밍 흐름:
    0초때 전송 -->
    1초때 데이터수신 ->
    10초때 전송 ->
    11초때 데이터수신 ->
    20초때 전송 ->
    21초때 데이터수신->
    ................

    부분의 구현은 타이머를 2개 놓아 두시고 사용하시면 해결 되지 않을까요??..
    Timer1에서 10초가 되면...Timer 2 Enable가 실행. Timer 2에는 1초 시간설정.
    데이타 수신 후,Timer 2 정지.


    문의 2번은 그냥 memo1의 라인 길이를 체크해서..처리 하시면 안되나요??..
    if memo1.line[0].Count >255 then ...

    저도 초보인지라...코드로 구현을 못하겠어요~~ㅎ^^;;