::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-07 10:30:23, Hit : 6883, Vote : 1853
 RS232 통신

unit CommExample;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
  StdCtrls, ExtCtrls;

type
   TCommDemoObject = class(TObject)

   private
   public

       commPortHandle:THandle;
       dcbInfo:Tdcb;
       errorFlag:Boolean;

       commPortError:DWORD;
       commPortStatus:TComStat;

       numberOfCharsActuallyWritten:DWORD;
//       numberOfCharsToRead:DWORD;
       numberOfCharsActuallyRead:DWORD;

       commPortInputBuffer:array[0..100] of Char;

       commPortOpen:Boolean;


       function    OpenCommPort(whichPort:String):Boolean;
       procedure   CloseCommPort;

       procedure   TransmitSingleChar(theChar:Char);
       procedure   TransmitString(theString:String);

       function    ReadCommPort:Integer;
   end;

implementation


function  TCommDemoObject.OpenCommPort(whichPort:String):Boolean;
begin
   // undo comm port if open
   if (commPortOpen) then
       CloseCommPort();
   // set flag state
   commPortOpen:=false;
   // open COMM port
   // use 'COM1','COM2','COM3', and 'COM4' to choose which port
   // to open
   commPortHandle:=CreateFile(PChar(whichPort),GENERIC_READ OR
GENERIC_WRITE,0,
       nil,OPEN_EXISTING,0,0);
//   commPortHandle:=CreateFile('COM1',GENERIC_READ OR GENERIC_WRITE,0,
//       nil,OPEN_EXISTING,0,0);
   // exit on failure
   if (commPortHandle=INVALID_HANDLE_VALUE) then
       begin
           Result:=false;
           exit;
       end;
   // get comm port state
   errorFlag:=GetCommState(commPortHandle,dcbInfo);
   // bail on failure
   if (NOT(errorFlag)) then
       begin
           CloseHandle(commPortHandle);
           Result:=false;
           exit;
       end;
   // setup COMM port settings
   dcbInfo.BaudRate:=9600;
   dcbInfo.ByteSize:=8;
   dcbInfo.Parity:=NOPARITY;
   dcbInfo.StopBits:=ONESTOPBIT;
   // set COMM port state
   errorFlag:=SetCommState(commPortHandle,dcbInfo);
   // bail on failure
   if (NOT(errorFlag)) then
       begin
           CloseHandle(commPortHandle);
           Result:=false;
           exit;
       end;
   // show opened port
   ShowMessage('Opened Comm Port: ' + whichPort);
   // set flag
   commPortOpen:=true;
   // set flag
   Result:=true;
end;

procedure  TCommDemoObject.CloseCommPort;
begin
   // close comm port handle
   CloseHandle(commPortHandle);
end;

procedure  TCommDemoObject.TransmitSingleChar(theChar:Char);
label
   CHECKSTATUS;
begin
//   // you can use escape function to manually raise/lower DTR
//   EscapeCommFunction(commPortHandle,SETDTR);
//   EscapeCommFunction(commPortHandle,CLRDTR);
//   // you can use escape function to manaully raise/lower RTS
//   EscapeCommFunction(commPortHandle,SETRTS);
//   EscapeCommFunction(commPortHandle,CLRRTS);
   // transmit char
   TransmitCommChar(commPortHandle,theChar);
   // wait for char to exit 1 char buffer
CHECKSTATUS:
   ClearCommError(commPortHandle,commPortError,@commPortStatus);
   if ( fTxim in commPortStatus.Flags) then
       begin;
           // read status again
           goto CHECKSTATUS;
       end;
end;

procedure  TCommDemoObject.TransmitString(theString:String);
var
   charBuffer:array[0..100] of Char;
begin
   // convert string to chars
   StrPCopy(charBuffer,theString);
   // send string to comm port
   WriteFile(commPortHandle,charBuffer,Length(theString),
       numberOfCharsActuallyWritten,nil);
end;

function  TCommDemoObject.ReadCommPort:Integer;
begin
   // read comm port status
   ClearCommError(commPortHandle,commPortError,@commPortStatus);
   // check input buffer count
   if (commPortStatus.cbInQue>0) then
       ReadFile(commPortHandle,commPortInputBuffer,
           commPortStatus.cbInQue,numberOfCharsActuallyRead,nil);
   // set number of chars actually read
   Result:=numberOfCharsActuallyRead;
end;

end.





491   [일반/컴포넌트] TRichEdit 의 선택된 영역만 인쇄하기  김영대 2003/03/07 4422 718
490   [시스템] CPU 종류 구하기  김영대 2003/03/07 4772 1193
489   [시스템] 사운드파일 없이 PC 스피커로 음악연주  김영대 2003/03/07 4606 923
488   [네트웍/인터넷] 프로그램으로 네트워크 드라이브 연결/해제  김영대 2003/03/07 6673 1245
487   [일반/컴포넌트] 윈도우즈 종료와 같은 그늘진 화면 만들기  김영대 2003/03/07 3126 836
486   [일반/컴포넌트] 아이콘 사이트  김영대 2003/03/07 3599 1065
485   [시스템] 윈도우즈 시스템 표준 폰트 구하기  김영대 2003/03/07 3002 846
  [네트웍/인터넷] RS232 통신  김영대 2003/03/07 6883 1853
483   [일반/컴포넌트] 주어진 영역의 화면 캡처  김영대 2003/03/07 3549 1008
482   [일반/컴포넌트] 숫자를 영문 표기로 바꾸기  김영대 2003/03/07 4234 886
481   [일반/컴포넌트] 숫자를 한글 표기로 바꾸기  김영대 2003/03/07 3588 927
480   [일반/컴포넌트] RichEdit 의 내용을 Bitmap 으로 만들기 2  김영대 2003/03/07 3751 979
479   [COM/OLE] MS-WORD 종료시키기  김영대 2003/03/07 2642 742
478   [윈도우즈 API] 시스템 사운드 연주하기  김영대 2003/03/07 4772 1296
477   [일반/컴포넌트] Algorithm to sort a TStringGrid #2  김영대 2003/03/07 4747 1197
476   [윈도우즈 API] 외부 프로그램의 좌표,상태 구하기  김영대 2003/03/07 3150 1013
475   [윈도우즈 API] 윈도우즈 Telnet 으로 호스트 접속하기  김영대 2003/03/07 4057 1117
474   [일반/컴포넌트] 특정한 폴더로 이동한 DOS 창 띄우기  김영대 2003/03/07 4088 1134
473   [시스템] DOS 명령어 실행하고 결과 받아오기  김영대 2003/03/07 6522 1548
472   [윈도우즈 API] NT의 현재 user가 administrative privilege 를 가지고 있는지?  김영대 2003/03/07 2957 808
471   [일반/컴포넌트] 두개의 StringGrid sync 마추기  김영대 2003/03/07 3684 1016
470   [일반/컴포넌트] 윈도우의 title bar 폰트 바꾸기  김영대 2003/03/07 3208 839
469   [네트웍/인터넷] 네트워크 공유 설정/해제 하기 (Windows 9x)  김영대 2003/03/07 4353 1078
468   [네트웍/인터넷] 네트워크 공유 정보 읽어오기 (WIndows 9x)  김영대 2003/03/07 3627 969
467   [일반/컴포넌트] 눌려진 키보드 키의 명칭 구하기  김영대 2003/03/07 7351 1437
466   [윈도우즈 API] Windows98 에서의 SetForegroundWindow  김영대 2003/03/07 5718 1489
465   [윈도우즈 API] Task bar 에 나타나지 않는 프로그램 만들기  김영대 2003/03/07 5130 1508
464   [COM/OLE] Outlook 사용하기  김영대 2003/03/07 3450 1090
463   [시스템] 지정한 drive가 CD-ROM 인지 검사하기  김영대 2003/03/07 6272 1649
462   [시스템] 어떤 어플리케이션이 시작 되는지 hook으로 알아내기  김영대 2003/03/07 5069 1400
461   [윈도우즈 API] 윈도우즈 탐색기의 아이콘 뽑아내서 사용하기  김영대 2003/03/07 6440 1887
460   [윈도우즈 API] System Images  김영대 2003/03/07 6279 1828
459   [윈도우즈 API] 컴퓨터/파일/폴더 찾기 화면 띄우기  김영대 2003/03/07 6142 1470
458   [일반/컴포넌트] Unix-format time 을 TDateTime 로 바꾸기  김영대 2003/03/07 4081 1121
457   [일반/컴포넌트] 실행시 component 를 Move/Resize 시키기  김영대 2003/03/07 3291 951
456   [일반/컴포넌트] TMemo 를 화면크기로 인쇄하기  김영대 2003/03/07 2679 692
455   [일반/컴포넌트] SpeedButton 에 OnMouseEnter/OnMouseExit 이벤트 넣기  김영대 2003/03/07 3921 1041
454   [윈도우즈 API] 키보드의 Scroll Lock 켜기/끄기  김영대 2003/03/07 4006 1135
453   [데이터베이스] table packing 하기  김영대 2003/03/07 3436 999
452   [윈도우즈 API] reboot Windows  김영대 2003/03/07 3857 1119

[이전 10개] [1]..[11][12] 13 [14][15][16][17][18][19][20]..[25] [다음 10개]
 

Copyright 1999-2021 Zeroboard / skin by zero