Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15121] [질문]comport3.1과 모뎀을 이용한 파일 전송 질문입니다. 또 막히네요 ㅠㅠ
thinkstone [magicljm] 2524 읽음    2014-04-06 14:20
아는게 없다보니 첩첩산중이네요.

죄송하지만 한번 더 봐 주세요.

프로그램 흐름은

현장pc의 데이터들은 파일명이 날짜로 되어 있고

사무실 pc에서 일정 시간 간격마다 디비에 들록된 현장들에 차레로 모뎀 접속해서

데이터파일을 읽어 와서 지정된 폴더에 저장 하고 처리하는 프로그램입니다.

현재 사무실pc엔 데이터가 없어서 'ALL.TXT'라고 파일명을 보내주고 현장pc에선 해당폴더의 모든 파일을 보내줍니다.

전체읽기모드로 시작해서 처음 현장은  예상대로 잘 되었고 포트연결도 잘 끊어져서

현장 pc 대기 상태이고

사무실px 에서 다음 현장 정보를 넘겨주기위해 접속하는데

현장pc창에 connect라고 뜨고 연결된 상태인데

프로그램이 뻑이 납니다. 그다음 진행이 안되요.

현장pc는  ClearToSend, DataSetReady, ReceiveLineSignalDetact에 불 들어와 있고 화면엔 connect 찍혀 있습니다.

사무실pc는 Tx(송신중)에만 불들어와 있습니다.

주요부분 소스 입니다.

파란색 부분이 문제입니다. 연결되었다는걸 못 알아채는건 아닌지 싶어서 두가지나 넣었네요

거기서 걸려야 되는데 안걸리는거 같아요.

통신 어려워요 ㅠㅠ




[현장pc 소스]

procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  w : string;
  i : integer;
begin
  Str  := '';
  ComPort.ReadStr(Str, Count);
  Memo.Text := Memo.Text + Str;

  for i:=1 to Count do begin
    if Str[i] = #2 then begin
      Rcv_State := 1; //데이터 수집시작
      kind := 'D';
      Str[i] := #32;
    end;
    if Str[i] = #3 then begin
       if Rcv_State = 1 then Rcv_State := 2
       else Rcv_State := 0;      //처음상태
       Str[i] := #32;
    end;
    if Str[i] = #4 then begin
      Rcv_State := 1; //file path 수집시작
      kind := 'F';
      Str[i] := #32;
    end;
    case Rcv_State of
    1 : RxBuf := RxBuf + Str[i]; // 데이터 수집시작
    2 : // 데이터 수집완료
        begin
          w := RxBuf + Str[i];
          if (kind='F') then
          begin
            Edit1.Text := w;
            SeekAndSendData(trim(w));
          end;
          if (kind='D') then Memo1.Text := Memo1.Text + w;
          //DatafilterPC(w); // w에 ghgghg*^UU 가 들어 있겠죠 ^^
          Rcv_State := 0; //초기 상태로를 만듭니다.
          ComPort.ClearBuffer(True,True); //버퍼 지워 줍니다.
          RxBuf := ''; // 임시 저장소 초기화 합니다.
        end;
    end;
  end;
end;

procedure TForm1.SeekAndSendData(fname: String);
var
  TxtFile : TextFile;
  buffer : string;
  slFileList : TStringList;
begin
  if(Pos('ALL', fname)>0) then
  begin
    slFileList := TStringList.Create;
    GetSearchedFileList('C:\ad_data', slFileList, '*.TXT', false);
    fname := slFileList[0];
    ComPort.WriteStr(#4 + fname + #3);
  end;
  if FileExists(fname) then
  begin
    ComPort.WriteStr(#2);
    AssignFile(TxtFile, fname) ;
    Reset(TxtFile) ;
    while not EOF(TxtFile) do   begin
      ReadLn(TxtFile, buffer) ;
      ComPort.WriteStr(buffer+#13#10) ;
    end;
    ComPort.WriteStr(#3);
    CloseFile(TxtFile) ;
  end
  else begin
    Comport.WriteStr(#1#3);
    if ComPort.Connected then ComPort.Close;
    memo.lines.Clear;
    Comport.Open;
  end;
end;




[사무실 pc 소스]




procedure TFMain.mReadAllClick(Sender: TObject);
var
Str : String;
begin
  Timer3.Interval := 1000 * 60 * StrToInt(Edit_Interval.Text);
  Timer3.Enabled := false;   //일정시간 간격 일기 타이머 중지
  connectOK := false;
  first := true;
  StatusBar1.Panels[2].Text := '모드 : 전체읽기';
  PageControl1.ActivePage := TabSheet1;
  ClientDataSet1.First;
  if not ClientDataSet1.Eof then Timer1.Enabled := true;
end;




procedure TFMain.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str,tmp: String;
  w : string;
  i : integer;
  TxtFile : TextFile;

begin
  Str  := '';
  ComPort.ReadStr(Str, Count);
  if (Rcv_State<>1) then
    Memo.Text := Memo.Text + Str;

  if (Pos('CONNECT', Str)>0) then   //파일 정보 전송
  begin
    connectOK := true;
    StatusBar1.Panels[2].Text := '모드 : 접속중...';
    noData := false;
    cdate := now;
    if (ldate<>'') then
    begin
      rdate := StrToDate(ldate);
      Str := #4 + 'c:\AD_DATA\' + DateToStr(rdate) + '.txt' + #3;
      StatusBar1.Panels[1].Text := DateToStr(rdate);
    end else begin
      Str := #4 + 'c:\AD_DATA\ALL.txt' + #3;
      StatusBar1.Panels[1].Text := '처음부터';
    end;
    ComPort.WriteStr(Str);
  end;

  if (Pos('No Data', Str)>0) then
  begin
    Comport.Close;
    noData := true;
    StatusBar1.Panels[2].Text := '모드 : No Data';
  end;

  for i:=1 to Count do begin
    if Str[i] = #7 then begin
      Rcv_State := 0;
      connectOK := true;
      StatusBar1.Panels[2].Text := '모드 : 접속중...';
      noData := false;
      cdate := now;
      if (ldate<>'') then
      begin
        rdate := StrToDate(ldate);
        Str := #4 + 'c:\AD_DATA\' + DateToStr(rdate) + '.txt' + #3;
        StatusBar1.Panels[1].Text := DateToStr(rdate);
      end else begin
        Str := #4 + 'c:\AD_DATA\ALL.txt' + #3;
        StatusBar1.Panels[1].Text := '처음부터';
      end;
      ComPort.WriteStr(Str);
    end;
    if Str[i] = #2 then begin
      StatusBar1.Panels[2].Text := '모드 : 데이터 수집중...';
      Rcv_State := 1; //데이터 수집시작
      kind := 'D';
      Str[i] := #32;
    end;
    if Str[i] = #3 then begin    //데이터 수집 끝
       if Rcv_State = 1 then Rcv_State := 2
       else Rcv_State := 0;      //처음상태
       Str[i] := #32;
    end;
    if Str[i] = #4 then begin
      ComPort.ClearBuffer(True,True); //버퍼 지워 줍니다.
      RxBuf := ''; // 임시 저장소 초기화 합니다.
      Rcv_State := 1; //file path 수집시작
      kind := 'F';
      Str[i] := #32;
    end;
    if Str[i] = #5 then begin
      ComPort.ClearBuffer(True,True); //버퍼 지워 줍니다.
      RxBuf := ''; // 임시 저장소 초기화 합니다.
      Rcv_State := 1; //수신된 처음 데이타파일명  수집시작
      kind := 'F1';
      Str[i] := #32;
    end;
    if Str[i] = #1 then begin
      Rcv_State := 2; //서버에서 해당 파일이 없으면 #1 를 보내줍니다.
      kind := 'E';
    end;
    case Rcv_State of
    1 : RxBuf := RxBuf + Str[i]; // 데이터 수집시작
    2 : // 데이터 수집완료
        begin
          w := RxBuf + Str[i];
          if (kind='F1') then         //시작날자가 없을때 서버에서 처음 파일명을 받아옴
          begin
            Edit1.Text := trim(w);
            tmp := StringReplace(ExtractFileName(w),'.txt','',[rfReplaceAll]);
            rdate := StrToDate(tmp);
            cdate := now;
            ldate := tmp;
          end;
          if (kind='D') then begin
            AssignFile(TxtFile, path + '\' + DateToStr(rdate) + '.txt') ;
            Rewrite(TxtFile) ;
            WriteLn(TxtFile, w) ;
            CloseFile(TxtFile) ;       //오늘 날짜 이전의 모든 데이터 파일 받아옴
            if ((Comparedate(rdate,cdate)<>0) and not noData) then
            begin
              rdate := IncDay(rdate,1);
              StatusBar1.Panels[1].Text := DateToStr(rdate);
              Str := #4 + 'c:\AD_DATA\' + DateToStr(rdate) + '.txt' + #3;
              ComPort.WriteStr(Str);
            end else begin
            //
            end;
            Rcv_State := 0; //초기 상태로를 만듭니다.
            ComPort.ClearBuffer(True,True); //버퍼 지워 줍니다.
            RxBuf := ''; // 임시 저장소 초기화 합니다.
          end;
          if (kind='E') then begin
            noData := true;
            StatusBar1.Panels[2].Text := '모드 : 송신 끝';
            Rcv_State := 0; //초기 상태로를 만듭니다.
            RxBuf := ''; // 임시 저장소 초기화 합니다.
            ComPort.WriteStr(#6);
            connectOk := false;
            Timer1.Enabled := true;    //다음 현장 정보를 읽으러 갑니다.
          end;

        end;

    end;
  end;
end;

procedure TFMain.Timer1Timer(Sender: TObject);   // dataset loop용
var
Str : String;
begin
  Timer1.Enabled := false;
  if not first then
  begin
    Timer2.Enabled := true;       ////다음 현장 접속을 위해 포트를 닫아줍니다.
    sleep(7000);
  end;
  if not ClientDataSet1.Eof then
  begin
    first := false;
    Comport.Port := 'COM' + ClientDataSet1.FieldByName('ComPort No').AsString;
    PhoneNo      := ClientDataSet1.FieldByName('전화번호').AsString;
    SiteName     := ClientDataSet1.FieldByName('현장').AsString;
    ldate        := ClientDataSet1.FieldByName('최종Data일시').AsString;
    path         := ClientDataSet1.FieldByName('Data Path').AsString;
    StatusBar1.Panels[0].Text := '현장명 :' + SiteName;
    ClientDataSet1.Next;
    try
      if not Comport.Connected then Comport.Open;
      if Comport.Connected then
      begin
        while not connectOK do
        begin
          StatusBar1.Panels[2].Text := '모드 : 접속중...';
          Str := 'atdt ' +  PhoneNo + #13#10;
          ComPort.WriteStr(Str);
          if not connectOK then sleep(2000);
        end;
      end;
    except
      on E: Exception do
      begin
        Log(E.Message);
      end;
    end;
  end
  else begin    //eof
     Timer3.Enabled := true;       //일정시간 간격 일기 타이머 시작                    .
  end;

end;


procedure TFMain.Timer2Timer(Sender: TObject);    //port close용
begin
  Timer2.Enabled := false;
  StatusBar1.Panels[1].Text := '모드 : No Data';
  Comport.Close;
  while Comport.Connected do sleep(100);
  if not Comport.connected then ShowMessage('close');
  //Timer1.Enabled := true;
end;

procedure TFMain.Timer3Timer(Sender: TObject);
begin
  mReadAllClick(Self);   //정해진 시간이 지나면 처음현장부터 다시 반복
end;



+ -

관련 글 리스트
15121 [질문]comport3.1과 모뎀을 이용한 파일 전송 질문입니다. 또 막히네요 ㅠㅠ thinkstone 2524 2014/04/06
15122     Re:[질문]comport3.1과 모뎀을 이용한 파일 전송 질문입니다. 또 막히네요 ㅠㅠ civilian 2266 2014/04/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.