델파이에서 TComport 설치하기

01) TComport 소스를 다운 받아 적당한 폴더에 설치한다.
         C:\Program Files\Borland\BDS\4.0\lib\cportu
         개인적으로 위의 폴더에 풀어두었다.

02) Delphi를 실행한구 CportLibX.dbk를 연다.(최신 버전을 선택한다.)

사용자 삽입 이미지

사용자 삽입 이미지

03) CportLibX.dpk 열면 CportLibX.bpl이 Project Manager에 표시된다.
     그러면 CportLibX를 오른쪽 클릭하면 아래의 그림과 같이 팝업메뉴가 표시되고
     거기서 Compile을 클릭한다.

사용자 삽입 이미지


사용자 삽입 이미지

04) 그리고 델파이에서 다시 DsgnCPortX.dpk를 연다.

사용자 삽입 이미지

05) 그러면 DsGnCportX.bpl이 Project Manager에 표시된다.
     DsgnCportX.bpl에서 오른쪽 클릭을 하여 Install을 클릭한다.

사용자 삽입 이미지

06) 그러면 TComport 가 설치된다.

사용자 삽입 이미지

     정상적으로 설치되면 Tool Palette에 TComport가 표시된다.

사용자 삽입 이미지

07) 설치가 종료된 에 Library Path를 설정해야된다.



     Options창의 Environment Options > Delpji Options > Library - Wind32에서 
     Library path와 Debug DCU path를 설정 한다.
     생성된 DCU파일들이 있는 폴더를 설정해야된다.
     Library path와 Debug DCU path에 아래 패스를 입력하고 [OK] 버튼을 클릭한다.

         $(BDS)\Lib\cportu\source;
        (위 패스는 자신이 소스를 둔 폴더이다.)

     이렇게 하면 TComport가 설치된다.


델파이에서 TComport 삭제하기

    기존의 TComport를 삭제할 때는 아래의 방법대로 삭제한다.

01) Component 메뉴에서 Install Pakages를 선택한다.

사용자 삽입 이미지

02) Design packages에서 Comport Library를 찾아 [Remove]버튼을 클릭한다.

사용자 삽입 이미지

03) 성공적으로 설치가 종료되면 아래의 메세지가 표시된다.

사용자 삽입 이미지


TComport  다운 받는 곳

SourceForge.net: ComPort Library

Posted by 띠리
타임아웃

통신 제어 프로그램은 상대 장치의 상태에 따라 통신이 도중에 끊어질 수 있다.
만약 100바이트가 올것이 데이터 수신 중에 송신 쪽의 문제로 80바이트만 송신한 경우
수신을 도중에 멈추고 알람을 표시할 필요가 있다.
타이머는 이런 목적으로 사용한다.

타이머의 설정은 SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)
를사용하고 설정된 데이터를 읽을 때는 GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)를 사용한다.


SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)


인수
hFile :
CreateFile()이 반환한 핸들

lpCommTimeouts :
타이머의 값이 들어있는 COMMTIMEOUTS 구조체의 포인터

반환값
함수가 성공하면 0이 아니고 실패하면 0

typedef struct _COMMTIMEOUTS{
  DWORD ReadIntervalTimeout;
  DWORD ReadTotalTimeoutMultiplier;
  DWORD ReadTotalTimeoutConstant;
  DWORD WriteTotalTimeoutMultiplier;
  DWORD WriteTotalTimeoutConstant;
}COMMTIMEOUTS、*LPCOMMTIMEOUTS;

ReadIntervalTimeout
데이터를 수신할 때 한문자를 수신한 후 다음 문자를 수신할 때까지의 대기 시간으로
밀리초 단위로 설장한다. 이 대기 시간 만큼 기다린 후 입력이 없을 경우 수신한 데이터를
반환한다.

이 값이 0인 경우, 타이머는 사용하지 않는다.
이 값이 MAXDWORD로 ReadTotalTimeoutMultiplier와 ReadTotalTimeoutConstant가
0인 경우 지정한 수신 수를 수신 전이라도 읽기 작업에서 빠져서 수신 데이터를 반환한다.


ReadTotalTimeoutMultiplier
읽기 작업을 위한 토탈 타임아웃 시간을 계산하기 위한 밀리초 단위의 곱하기 계수를 지정한다.

ReadTotalTimeoutConstant
읽기 작업을 위한 토탈 타임아웃 시간을 계산하기 위한 밀리 초 단위로 지정하는 정수로
사용된다.

ReadTotalTimeoutMultiplier와 ReadTotalTimeoutConstant는 읽기 작업에 걸리는
총시간을 설정하는 변수들로 이 두변수가 0인 경우 읽기 작업에는
토탈 타임아웃 타이머가 사용하지 않는다.


WriteTotalTimeoutMultiplier
쓰기  작업을 위한 토탈 타임아웃 시간을 계산하기 위한 밀리초 단위의 곱하기 계수를 지정한다.

WriteTotalTimeoutConstant
쓰기 작업을 위한 토탈 타임아웃 시간을 계산하기 위한 밀리 초 단위로 지정하는 정수로
사용된다.

WriteTotalTimeoutMultiplier와 WriteTotalTimeoutConstant는 쓰기 작업에 걸리는
총시간을 설정하는 변수들로 이 두변수가 0인 경우 쓰기 작업에는
토탈 타임아웃 타이머가 사용하지 않는다.



어플리케이션이 ReadIntervalTimeout과 ReadTotalTimeoutMultilier를 MAXDWORD로 설정하고
MAXDWORD > ReadTotalTimeoutConstant > 0으로 설정하면
ReadFile함수가 사용될 때 아래와 같이 된다.

- 입력 버퍼에 수신 데이터가 있으면 ReadFile은 바로 버퍼의 문자를 반환한다.
- 입력 버퍼에 수신 데이터가 없으면 ReadFile은 수신할 때까지 기다렸다가 반환한다.
- ReadTotalTimeoutConstant에 의해 지정된 시간 이내에 1바이트라도 수신하지 않으면
  ReadFile은 타임아웃이 된다.

타이머의 시간 설정
구체적으로 어떻게 타이머의 시간을 설정하면 좋을까?
COMMTIMEOUTS 구조체의 변수를 보면 알 수 있는 것처럼 감시하는 대상은 2종류가 있다.
하나는 인터벌 시간이고 다른 하나는 토탈 시간이다.
인터벌 시간은 수신할 데이터 별로 타이머 감시를 하기 위한 것이기 때문에
예를들면 9600bps로 수신할 경우 1케릭터는 1ms정도이기 때문에 여유를 봐서
10ms이면 충분하다. (단 상대가 연속해서 데이터를 송신하는 경우이다.)
토털 시간은 이하의 계산식으로 계산된다. 이 두개의 감시시간을 넘으면 타임아웃이 발생한다.
타임아웃의 결과 수신 동작이나 송신 동자은 도중에 중단되고 수신일 때는
타임아웃이 발생한 시점까지의 데이터를 읽는다.

수신
ReadIntervalTimeout은 다음에 수신할 때 까지의 최대 대기 시간을 msec로 지정한다.
ReadTotalTimeoutMuliplier와 ReadTotalTimeoutConstant로 수신 토탈 시간을
이하의 식으로 계산한다.

수신 인터벌 시간 = ReadIntervalTimeout(msec)
수신 토탈 시간 =
(ReadTotalTimeoutMuliplier * 수신할 Byte수) + ReadTotalTimeoutConstant(msec)

송신
송신에는 데이터 간격 타이머는 없다.
WriteTotalTimeoutMuliplier와 WriteTotalTimeoutConstant로 송신 토탈 시간을
이하의 식으로 계산한다.

송신 토탈 시간 =
(WriteTotalTimeoutMuliplier * 송신할 Byte수) + WriteTotalTimeoutConstant(msec)


◆ 타이머의 시간 설정 예제
소스는 VS2005용이고
컴포트를 COM1에서 COM4로 고정으로 되어있음.
타임아웃을 설정에 따라 어떻게 데이터를 수신하는지를 보여주는 예제




Posted by 띠리


시리얼 포트 설정

시리얼 I/O의 파라미터 설정은 SetCommState()로 하고 GetCommState()로 설정된 파라미터 정보를
볼 수 있다.

BOOL SetCommState(
    HANDLE  hFile,     // 통신 디바이스 핸들
    LPDCB    lpDCB    // DCB 구조체 포인터
};


인수:
hFile:
  CreateFile()에서 반환된 핸들

lpDCB:
  현재 설정된 다비아스 상태를 가지고 있는 DCB 구조체 포인터

반환값
  성공하면 0이 아니고 실패하면 0

BOOL GetCommState(
    HANDLE  hFile,     // 통신 디바이스 핸들
    LPDCB    lpDCB    // DCB 구조체 포인터
};


인수:
hFile:
  CreateFile()에서 반환된 핸들

lpDCB:
  현재 설정된 다비아스 상태를 가지고 있는 DCB 구조체 포인터

반환값
  성공하면 0이 아니고 실패하면 0


두함수의 파라미터인 DCB구조체의 맴버변수

typedef struct _DCB{             // dcb
  DWORD DCBlength;              // DCB 사이즈
  DWORD BaudRate;               //  현재 보레이트
  DWORD fBinary:1;                 // 바이너리 모드, EOF 체크안함
  DWORD fParity:1;                  // 패리티 체크
  DWORD fOutxCtsFlow:1;        // CTS 출력 플로제어
  DWORD fOutxDsrFlow:1;        // DSR 출력 플로제어
  DWORD fDtrControl:2;            // DTR 플로 제어 타입
  DWORD fDsrSensitivity:1;       // DSR 감지
  DWORDfTXContinueOnXoff:1; // XOFF라고 계속 전송
  DWORD fOutX:1;                   // XON/XOFF 외부 플로 제어
  DWORD fInX:1;                     // XON/XOFF 내부 플로 제어
  DWORD fErrorChar:1;            // 오류 수정(에러 치환 가능)
  DWORD fNull:1;                    // 수신 데이터의 NULL 없애기
  DWORD fRtsControl:2;           // RTS 플로 제어
  DWORD fAbortOnError:1;        // 에러 발생시 입출력 취소
  DWORD fDummy2:17;             // 예약
  WORD wReserved ;              // 현재 미사용
  WORD XonLim;                     // 송신 XON 제한치
  WORD XoffLim;                     // 송신 XOFF 제한치
  BYTE ByteSize;                   // 1바이트의 비트 수, 4-8
  BYTE Parity;                        // 0~4, 패리티 없음, 홀수, 짝수, 마크, 스페이스
  BYTE StopBits;                    // 0~2 = 1, 1.5, 2
  char XonChar;                     // 송수신 XON 문자
  char XoffChar;                     // 송수신 XOFF 문자
  char ErrorChar;                    // 에러 치환 문자
  char EofChar;                      // 입력 종료 문자
  char EvtChar;                      // 수신 이벤트 문자
  WORD wReserved1;             // 예약, 사용불가
}DCB;

DCBlength
DCB구조체의 길이 지정

BaudRate
통신 디바이스가 동작하는 Baud rate 지정

fBinary
바이너리 모드 지정
Win32 API는 비 바이너리 모드 전송을 지원안함
따라서 TRUE로 설정해야 되고 FALSE로 설정하면 동작하지 않음

fParity
패리티 체크 지정
TRUE로 설정하면 패리티 체크가 유효화되고 에러가 보고된다.

fOutxCtsFlow
송신 플로 제어를 위해 CTS 신호 감시 여부 지정
TRUE로 설정하면 CTS가 비활성화 되면 다시 CTS가 활성화 될때까지 송신이 중단됨

fOutxDsrFlow
송신 플로 제어를 위해 DSR 신호 감시 여부 지정
TRUE로 설정하면 DSR가 비활성화 되면 다시 DSR가 활성화 될때까지 송신이 중단됨

fDtrControl
DTR 플로 제어 지정

    DTR_CONTROL_DISABLE
    DTR 디바이스가 오픈되어 그것이 금지 상태일 경우
    DTR 라인을 비활성화
    DTR_CONTROL_ENABLE 
    디바이스가 오픈되어 그것이 ON인 상태인 경우
    DTR 라인을 활성화
    DTR_CONTROL_HANDSHAKE
    DTR 핸드쉐이크를 가능하게 함
    만약 DTR 핸드쉐이크를 가능하게 설정하면 어플리케이션에 의해
    EscapeCommFunction 함수를 사용하요 라인을 조정하면 에러가 됨

fDsrSensitivity
통신 드라이버가 DSR 시그널 상태에 민감한지를 지정
TRUE로 설정하면 DSR 모뎀 입력 라인이 YES인한 드라이버는 수신한 모든 바이트를 무시

fTXContinueOnXoff
상대의 입력 버퍼가 FULL이고 드라이버가 XoffCha문자를 보냈을 때에
송신을 정지할 것인가를 지정
TRUE로 설정하면 상대의 입력 버퍼가 버퍼 사이즈 XoffLim 바이트가 되어
수신 정지가 되기 때문에 XoFF 케릭터를 보내도 송신을 계속함
FALSE로 설정하면 상대의 입력 버퍼가 XonLim이 되어 XON케릭터를 송신다시 하기 위해
보낼때 까지 송신하지 않음

fOutX
송신 사이에 XON/XOFF 플로 제어 사용 지정
TRUE로 설정하면 XoffChar문자를 수신했을 때 송신을 정지하고
XonChar문자를 수신하면 송신을 재개함

fInX
수신 사이에 XON/XOFF 플로 제어 사용 지정
TRUE로 설정하면 입력 버퍼 중에 수신 데이터가 XoffLim이 된 경우
XoffChar문자가 보내지고 XonLim이 된 경우 Xonchar 문자가 송신됨

fErrorChar
패리티가 틀린 데이터를 수신했을 때, ErrorChar 변수에 의해 지정된 문자 치환 지정
TRUE로 설정하면 fParity가 TRUE이면 패리티 에어시 ErrorChar와 수신 데이터를 바꿈

fNull
무효한 수신 데이터 처분 지정
TRUE로 설정하면 수신하지 않고 무효한 데이터를 데이터를 처분한다.

fRtsControl
RTS 플로 제어 지정
값이 0이면 RTS_CONTROL_HANDSHAKE이다.
    RTS_CONTROL_DISABLE
    RTS 디바이스가 오픈되어 그것이 금지 상태일 경우
    RTS 라인을 비활성화
    RTS_CONTROL_ENABLE 
    디바이스가 오픈되어 그것이 ON인 상태인 경우
    RTS 라인을 활성화
    RTS_CONTROL_HANDSHAKE
    RTS 핸드쉐이크를 가능하게 함
    드라이버는 입력 버퍼중에 수신 데이터가 반이하가 되면
    RTS라인을 올리고 3/4이하인 경우에는 내린다.
    RTS 핸드쉐이크를 가능하게 설정하면 어플리케이션에 의해
    EscapeCommFunction 함수를 사용하요 라인을 조정하면 에러가 됨

fAbortOnError
에러가 발생한 경우 송수신을 종료할것인지를 지정
TRUE로 설정하면 에러 스테이터스가 에러 발생했을 때
모든 송수신 동작이 종료함
드라이버는 어플리케이션이 ClearCommError함수를 불러 에러에
응답할 때 까지 어떤 통신 조작도 할 수 없음

fDummy2
사용안함

wReserved
사용안함 / 반드시 0을 설정해야 됨

XonLim
XON문자가 보내질 때까지 입력 버퍼에 허용되는 최소 바이트 수를 지정

XoffLim
XOFF문자가 보내질 때까지 입력 버퍼에 허용되는 최대 바이트 수를 지정
최대 허가 바이트 수는 이 값을 입력 버퍼 사이즈(바이트)에서 뺌으로 계산됨

ByteSize
송수신 바이트의 비트 수를 지정

Parity
사용되는 패리티 스킴을 지정

StopBits
사용되는 스탑 비트를 지정

XonChar
송수신을 위한 XON문자의 값을 지정

XoffChar
송수신을 위한 XOFF문자의 값을 지정

ErrorChar
틀린 패리티를 수신한 바이트를 교환하기 위한 준비된 문자 값

EofChar
데이터의 끝을 시그널로 전하기 위해 사용되는 문자 값

EvtChar
이벤트를 시그널로 전하기 위해 사용되는 문자 값

wReserved1
사용하지 않음



 

invalid-file

DCB 정보 보기

VS2005로 작성한 DCB정보 보기 예제
인터넷에 소스를 대충 편집한거여서 소스가 지저분함
컴포트도 MyCommPage.cpp 파일에

  CString CommName = "COM1";

이렇게 고정으로 만들었다.(고치기가 귀찮아서)
여러 파일이 있기는 하지만 다 보이지 않게 하고
MyDCBPage1.cpp만 참고로 하면 될 것같다.

Posted by 띠리


시리얼 포트 오픈

시리얼 포트는 파일처럼 다룬다.
시리얼 포트를 오븐 하기위해서는 CreateFile()을 사용한다.

HANDLE CreateFile(
  LPCTSTR lpFileName,         // 포트 이름을 가르키는 버퍼의 포인터
  DWORD dwDesiredAccess,       // 억세스모드(READ, WRITE)
  DWORD dwShareMode,          // 포트의 공유 방법 비정(공유 불가: 0으로 설정)
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 시큐리티 속성
  DWORD dwCreationDisposition,  // 포트 여는 방법 지정(OPEN_EXISTING로 기존 파일 지정)
  DWORD dwFlagsAndAttributes,   // 포트의 속성 지정
  HANDLE hTemplateFile          // 템플레이트 파일의 핸들(항상 NULL로 지정)
 );


인수:

lpFileName: COM1이나 COM2등의 시리얼 포트 이름을 지정한다.
(LPT1같은 프린터 포트도 지정할 수 있다.)

dwDesiredAccess: 이하의 읽기 모드를 단독 또는 OR로 지정한다.

의미
0 디바이스의 속성을 묻는다.
GENERIC_READ 읽기 억세스.
읽기 쓰기를 할때는 GENERIC_WRITE를 조합해서 지정
GENERIC_WRITE 쓰기 억세스.
쓰기 쓰기를 할때는 GENERIC_READ를 조합해서 지정

일반적으로 시리얼 포트는 입출력이 가능하기 때문에 GENERIC_READ | GENERIC_WRITE로 설정한다.

dwShareMode : 포트의 공유모드로 이하의 값을 단독이나 OR로 지정한다.
0을 지정하면 공유하지 않는다.
 
 
의미
FILE_SHARE_DELETE Windows NT 일 경우만 : 
후속의 오픈 조작으로 삭제 억세스가 요구될 때, 그 오픈을 허가
FILE_SHARE_READ 후속의 호픈 조작으로 읽기 억세스가 요구될 때 그 오픈을 허가
FILE_SHARE_WRITE 후속의 호픈 조작으로 쓰기 억세스가 요구될 때 그 오픈을 허가

 
 포트는 파일과 달리 공유할수 없기 때문에 0으로 지정한다. 이 경우는 이미 오픈 되어진 포트를 다른 프로세스가 오픈 하려고 하면 CreateFile()은 에러가 된다. 하지만 같은 프로세스의 복수 스레드는 CraeteFile()로 반환된 핸들을 공유할 수 있다.

lpSecurityAttributes : 시큐리티 속성으로 SECURITY_ATTRIBUTES 구조체의 포인터이다.
NULL을 설정하면 핸들은 자식 프로세스에 계승되어지지않는다.

dwCreationDisposition : 파일이 존재할 때 또는 존재하지 않을 때, 각각의 동작을 지정한다.
시리얼 포트는 기존 파일 이외에 있을 수 없기 때문에 OPEN_EXISTING을 지정한다.

dwFlagsAndAttributes : 파일의 속성 및 플래그를 지정한다.
시리얼 포트에서 사용할만한 플래그는 FILE_FLAG_OVERLAPPED 뿐이다.

의미
FILE_FLAG_OVERLAPPED 시간이 걸리는 처리에 있어서 ERROR_IO_PENDING을 반환하도록 한다. 처리가 끝나면 이벤트가 시그널 상태로 설정된다.
이 플래그를 지정했을 때는 ReadFile 함수나 WriteFile 함수로 OVERLAPPED 구조체를 지정해야만 된다.


hTemplateFile : 시리얼 포트에 관계없기 때문에 NULL을 지정한다.


시리얼 포트 클로즈

클로즈는 CreateFile()이 반환하는 핸들을 인수로 하여 CloseHandle을 호출한다.

BOOL CloseHandle( HANDLE hObject );


반환값 : 성공하면 0 이외의 값, 실패하면 0을 반환한다.

시리얼 포트 상태 정보 얻기

자신의 컴퓨터에 시리얼 포트는 어느 정도의 성능인지 등 보통은 신경쓰지않지만 디바이스 드라이버를 포함한 시리얼 포트의 성능을 앎으로 서포트 하지않는 보레이트를 잘못해서 설정했을 때의 부정한 설정을 막아준다.

시리얼 포트에 관한 정보는 GetCommProperties()의 호출로 COMPROC 구조체 변수를 읽어온다.

BOOL GetCommProperties (HANDLE hFile, LPCOMMPROP lpCommProp );


인수 :

hFile : 통신 디바이스의 핸들
CreateFile함수가 반환하는 핸들

lpCommProp : 통신 특성 정보가 반환되어 COMPROC 구조체의 포인터

반환값 : 함수가 성공하면 0 이외의 값, 실패하면 0을 반환한다.

LPCOMMPROP 구조체는 이하의 구성의 시리얼 포트 정보를 가진다.

typedef struct _COMMPROP{
  WORD wPacketLength;     // 구조체 사이즈
  WORD wPacketVersion;    // 구조체 버젼
  DWORD dwServiceMask;    // 실행된 서비스
  DWORD dwReserved1;      // 예약
  DWORD dwMaxTxQueue;    // 바이트 단위의 최대 송신 버퍼 사이즈
  DWORD dwMaxRxQueue;    // 바이트 단위의 최대 수신 버퍼 사이즈
  DWORD dwMaxBaud;      // 보레이트 최대값
  DWORD dwProvSubType;       // 특정 프로바이더 타입
  DWORD dwProvCapabilities;     // 서포트된 함수
  DWORD dwSettableParams;      // 변경 가능 파라미터
  DWORD dwSettableBaud;     // 허가된 보레이트
  WORD wSettableData;        // 허가된 바이트 사이즈
  WORD wSettableStopParity;      // 스탑 비트 / 패리티 허가
  DWORD dwCurrentTxQueue;     // Tx 버퍼 사이즈
  DWORD dwCurrentRxQueue;     // Rx 버퍼 사이즈
  DWORD dwProvSpec1;       // 프로바이더 특정 데이터
  DWORD dwProvSpec2;       // 프로바이더 특정 데이터
  WCHAR wcProvChar[1];       // 프로바이더 특정 데이터
}COMMPROP;

dwServiceMask : 시링러 포트의 경우는 항상 SP_SERIALCOMM이다.
dwReserved1 : 미사용
dwMaxTxQueue : 출력 버퍼의 최대값(바이트), 0을 설정하면 무제한
dwMaxRxQueue : 입력 버퍼의 최대값(바이트), 0을 설정하면 무제한
dwMaxBaud : 이하의 상수로 설장 가능한 보레이트의 최대값

의미
BAUD_075 75 bps
BAUD_110 110 bps
BAUD_134_5 134.5 bps
BAUD_150 150 bps
BAUD_300 300 bps
BAUD_600 600 bps
BAUD_1200 1200 bps
BAUD_1800 1800 bps
BAUD_2400 2400 bps
BAUD_4800 4800 bps
BAUD_7200 7200 bps
BAUD_9600 9600 bps
BAUD_14400 14400 bps
BAUD_19200 19200 bps
BAUD_38400 38400 bps
BAUD_56K 56K bps
BAUD_57600 57600 bps
BAUD_115200 115200 bps
BAUD_128K 128K bps
BAUD_USER 유저 설정

dwProvSubType : 이하의 상수로 CreateFile()에 의해 작성된 통신 디바이스가 무엇을 서포트하는지를 알려준다. 시리얼 포트의 경우는 PST_RS232가 된다.

의미
PST_FAX 팩스
PST_LAT LAT 프로토콜
PST_MODEM 모뎁
PST_NETWORK_BRIDGE 미정의 네트워크 브릿지
PST_PARALLELPORT 패럴렐 포트
PST_RS232 RS-232 시리얼 포트
PST_RS422 RS-422 포트
PST_RS423 RS-423 포트
PST_RS449 RS-449 포트
PST_SCANNER 스캐너
PST_TCPIP_TELNET TCP/IP TelnetR 프로토콜
PST_UNSPECIFIED 미정의
PST_X25 X.25 스탠다드


dwProvCapabilities : 이하의 상수로 시리얼 포트가 서포트 하는 기능을 보여준다.
통산의 리리얼 포트 드라이버는 PCF_16BITMODE와 PCF_SPECIALCHARS 이외는 대체적으로 서포트한다.

의미
PCF_16BITMODE 특별한 16비트 모드를 서포트
PCF_DTRDSR DTR/DSR 서포트
PCF_INTTIMEOUTS 인터벌 타임아웃을 서포트
PCF_PARITY_CHECK 패리티 체크 서포트
PCF_RLSD RLSD(CD) 서포트
PCF_RTSCTS RTS/CTS 서포트
PCF_SETXCHAR 설정 가능한 XON/XOFF 서포트
PCF_SPECIALCHARS 설정 가능한 특수문자 서포트
PCF_TOTALTIMEOUTS 토탈 타임아웃 서포트
PCF_XONXOFF XON/XOFF 플로 제어 서포트

dwSettableParams : 이하의 상수로 설정 변경 가능한 파라미터를 나타낸다.

의미
SP_BAUD 보레이트
SP_DATABITS 1케릭터의 비트수
SP_HANDSHAKING 핸드 쉐이크 방식(플로 제어)
SP_PARITY 패리티 비트 수
SP_PARITY_CHECK 패리티 체크의 유무
SP_RLSD RLSD(CD)
SP_STOPBITS 스톱 비트 수

dwSettableBaud : 설정 가능한 모든 보레이트의 종류를 dwMaxBaud의 항목으로 정의된 상수값으로 OR한 값을 나타낸다.

wSettableData : 이하의 상수의 OR로 설정 가능한 1 케릭터의 비트 수를 나타낸다.
시리얼 포트에서는 5~8이 서포트 된다.

의미
DATABITS_5 5 data bits
DATABITS_6 6 data bits
DATABITS_7 7 data bits
DATABITS_8 8 data bits
DATABITS_16 16 data bits
DATABITS_16X 시리얼 회선을 사용한 특수한 와이드 버스

wSettableStopParity : 이항의 상수의 OR로 설정 가능한 스톱 비트 수와 패리티를 나타낸다.

의미
STOPBITS_10 1  스톱 비트
STOPBITS_15 1.5 스톱 비트
STOPBITS_20 2 스톱 비트
PARITY_NONE 패리티 없음
PARITY_ODD 홀수 패리티
PARITY_EVEN 짝수 패리티
PARITY_MARK 마크  패리티
PARITY_SPACE         스페이스 패리티


dwCurrentTxQueue : 현재 송신 버퍼 사이즈를 나타낸다.

dwCurrentRxQueue : 현재 수신 버퍼 사이즈를 나타낸다.

시리얼 포트의 상태를 얻기 예제

COMMPROP구조체의 주요 내용을 표시하는 프로퍼티 시트 예제

이 예제는 컴포트1에서 4까지를 고정으로 오픈한다.
(요즘 기본적으로 컴포트가 없는 컴퓨터가 많아서 USB를 쓰는 사람은
컴포트를 1에서 읽는 것을 좀 수정할 필요가 있다.
USB 컴포트가 3이나 4로 잡히면 그냥 실행시켜도 문제없다.)

컴포트 1에서 4를 열어 각 포트의 시리얼 포트 상태와
각 포트에 설정 가능값을 표시한다.


Posted by 띠리

델파이를 첨 써보는지라 델파이에서 시리얼 통신을 하려면 어떻게 해야된나
오늘 하루 종일 열심히 해맸다.

SourceForge.net에 델파이용 ComPort Library가 있어서
그것을 이용해서 간단한 시리얼 통신하는 프로그램을 만들어 보려했지만
델파이 초짜다 보니 무엇을 어떻게 해야되는지도 한참 해멨다.

http://sourceforge.net/projects/comport/

먼저 위 사이트에 가서 Download를 선택하면
지금은 ComPort Library 3.1(cport-3.10.zip)을 다운 로드 받을 수 있다.

다운로드 받은 압축파일을 풀면 여러개의 파일이 나온다.
여기서 sources.zip 파일과 examples.zip 파일을 다시 푼다.

새로 작업할 폴더를 하나 만든다.
새 폴더에 "examples\delphi" 폴더 밑의 소스를 전부 복사해서 붙여 넣는다.
그리고 그 새 폴더에 "Include"란 폴더를 만들어
"Include"에 "sources"에 있던 파일을 전부 복사해서 붙여 넣는다.

"Include" 폴더에서 CPortLib10.dpk을 선택하여 더블 클릭하면
델파이가 실행되면 CPortLib10.dpk이 열리게 된다.

사용자 삽입 이미지


위 그림과 같이 프로젝트 메니저에 CPortLib10.bpl이 표시된다.
그러면 "CPortLib10.bpl"에서 오른 쪽 클릭을 하면 아래 그림과 같은 메뉴가 뜬다.

사용자 삽입 이미지


거기서 Compile을 한뒤 다시 Install을 하면 Install이 되었다는 메세지가 뜬다.

사용자 삽입 이미지


그리고 ComPort Library를 컴파일한 후 "Add Existing Project..."를 선택한다.

사용자 삽입 이미지


"Include" 폴더에서 "DsgnCPort10.dpk"을 선택하여 CPortLib10.bpl과 동일하게
DsgnCPort10.bpl도 컴파일하고 인스톨을 한다.

사용자 삽입 이미지


사용자 삽입 이미지


툴 팔레트에 CportLib이 추가된다.

사용자 삽입 이미지

다시 "Add Existing Project..."를 선택하여
조금 전에 만들어 두었던 새폴더에서 "ComExample.dpr"을 선택한다.
ComExample 프로젝트가 추가된다.
("CPortLib10.bpl"과 "DsgnCPort10.bpl"을 사전에 인스톨을 하지 않으면
"ComExample.dpr"을 열때 에러가 발생한다.)

사용자 삽입 이미지

"ComExample.exe"를 선택하여 오른쪽 클릭을 하여 "Add..."를 선택하여
"include" 폴더의 CPortReg.pas 파일 이외의 모든 파일을 선택하여
열기를 하면 pas파일들이 프로젝트에 추가되어진다.

사용자 삽입 이미지


(CPortReg.pas 파일을 선택하여 빌드를 하면
[Pascal Fatal Error] ComExample.dpr(13): F1026 File not found: 'PropertyCategories.dcu'
이런 에러가 뜬다.
CPortReg.pas 파일을 선택하지않아도 프로그램이 돌아가는데 문제는 없다.)

이렇게 준비가 다 되면 "Ctrl+F9"를 눌러 코드를 컴파일하고
"F9"를 눌러 프로그램을 실행시킨다.
이렇게 하면 ComPort Library의 프로그램을 실행시킬 수 있다.

사용자 삽입 이미지


아는 사람이야 아주 쉽게 이것을 컴파일하고 실행시킬 수 있겠지만 처음하는 사람에게는
정말 쉽지않은 것같다. -.-;;




위 파일에 Readme를 보면 영어로 인스톨하는 방법이 쓰여져 있긴하다.

Posted by 띠리

RS232C 메모

2007.08.27 17:23
동작모드 Single-Ended
최대도달거리 약15m
최고통신속도 20kb/s
지원전송방식 Full Duplex
최대출력전압 ±25V
최대입력전압 ±15V

RS232C

데이터 단말기(DTE: Data Terminal Equipment)와 데이터 통신기(DCE: Data Communication Equipment)사이의 인터페이스에 대한 전기적인 인수, 컨트롤 핸드쉐이킹, 전송속도, 신호 대기시간, 임피던스 인수등를 정의되어 있으며 전송되는 데이터의 포맷과 내용에 대해서는 정의되어 있지않고 DTE간의 인터페이스에 대한 내용도 포함하지 않는다.



 
사용자 삽입 이미지
RS232 9pin 커넥터

핀번호 기능 신호명 방향
1 케리어 검출 CD 입력
2 데이터 수신 RXD 입력
3 데이터 송신 TXD 출력
4 데이터 단말 Ready DTR 출력
5 시그널 그라운도 GND
6 데이터 셋 Ready DSR 입력
7 송신 요구 RTS 출력
8 송신 가능 CTS 입력
9 링 인디케이터 RI 입력


사용자 삽입 이미지
RS232 25pin 커넥터

핀번호 기능 신호명 방향
2 데이터 송신 TXD 출력
3 데이터 수신タ RXD 입력
4 송신 요구 RTS 출력
5 송신 가능 CTS 입력
6 데이터 셋 Ready DSR 입력
7 시그널 그라운드 GND
8 케리어 검출 CD 입력
20 데이터 단말 Ready DTR 출력
22 링 인디케이터 RI 입력


RS232C 신호

TXD - Transmit Data
비동기식 직렬통신 장치가 외부 장치로 정보를 보낼 때 직렬통신 데이터가 나온다

RXD - Receive Data  
외부 장치에서 들어오는 직렬통신 데이터를 입력받는다.

RTS - Ready To Send  
컴퓨터와 같은 DTE장치가 모뎀 또는 프린터와 같은 DCE장치에게 데이터를 받을 준비가 됐음을 알린다.

CTS - Clear To Send  
모뎀 또는 프린터와 같은 DCE장치가 컴퓨터와 같은 DTE장치에게 데이터를 받을 준비가 됐음을 알린다.
 
DTR - Data Terminal Ready  
컴퓨터 또는 터미널이 모뎀에게 자신이 송수신 가능한 상태임을 알린다.
일반적으로 컴퓨터등이 전원 인가후 통신 포트를 초기화한 후 이신호를 출력시킨다.  

DSR - Data Set Ready  
모뎀이 컴퓨터 또는 터미널에게 자신이 송수신 가능한 상태임을 알린다.
일반적으로 모뎀에 전원 인가후 모뎀이 자신의 상태를 파악한후 이상이 없을 때 이신호를 출력시킨다. 

DCD - Data Carrier Detect  
모뎀이 상대편 모뎀과 전화선등을 통해서 접속이 완료되었을 때 상대편 모뎀이 캐리어신호를 보내오며 이신호를 검출하였음을 컴퓨터 또는 터미널에 알려준다.  

RI - Ring Indicator  
상대편 모뎀이 통신을 하기위해서 먼저 전화를 걸어오면 전화 벨이 울리게 된다.
이때 이신호를 모뎀이 인식하여 컴퓨터 또는 터미널에 알려준다.
일반적으로 컴퓨터가 이신호를 받게되면 전화벨 신호에 응답하는 프로그램을 인터럽터등을 통해서 호출하게 된다.

GND - Ground
RX-XXX방식은 전압으로 신호를 전송한다.
그러므로 기분이 되는 접지가 있어야 한다.

DTR 제어를 할 때, DTR과 상대의 DSR에 접속
DTR 제어를 하지 않을 때, 자신의 DTR과 자신의 DSR에 접속

RTS 제어를 할 때, RTS과 상대의 CTS에 접속
RTS 제어를 하지 않을 때, 자신의 RTS과 자신의 CTS에 접속


≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡    

시리얼 통신을 하기위해서는 최소한 위에
파랑색으로 바꾸어 놓은 세가지는 연결해야 되는 것같다. ^^;

≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡     ≡    

시리얼 통신의 동기/비동기

   ▶ 동기
각 장치들이 같은 클럭 주기를 가지고 동작한다.
어떤 장치에서 다른 장치에 데이터를 보내고 일정시간 대기한 후 데이터를 받는다.

   ▶ 비동기
각 장치별로 다른 클럭 주기를 가지고 동작한다.
클럭 주기가 장치별로 틀리기 때문에 Start bit와 Stop bit을 추가하여 데이터가 어디부터 시작해서 어디서 끝나는지 받는 쪽에 알려주어야 된다.
하나의 데이터를 보낼 때 부가적으로 아래와 같은 비트를 보내야 된다.

   <Start bit + Data bit + Parity bit + Stop bit>

시리얼 통신과 패럴렐 통신

 

시리얼 (직렬)  

패럴렐 (병렬)

데이터
전송 방식

하나의 전선에 1비트식 차례로 전송

여러 개의 전선에 동시에 전송

특징

통신이 간단하지만 속도가 느림

속도가 빠름

사용예

키보드, 마우스, 모뎀, LAN, RS232

프린터, HDD, FDD, 비디오 카드



시리얼 통신 조건

    스타트 비트
    데이터의 시작을 나타내는 비트, 일반적으로 1비트

    데이터 비트
    데이터의 한 문자를 구성하는 비트 수

    패리티 비트
    맞는 데이터인지 체크하기 위해 데이터에 덧붙이는 비트

    스톱 비트
    데이터 열의 마지막에 붙여서 다음 스타트 비트가 검출할 수 있게 함

    보레이트 (baud rate)
    1초간에 몇 비트 정산할 것인지를 지정

    X파라미터
    플로 제어용 파라미터
    수신 버퍼 안에 데이터가 일정량을 넘었을 때 Xon을 송신하고
    일정량 이하일 때 Xoff를 송신. Xon, Xoff일 때, 송신하는 문자열을 지정할 수 있음

Posted by 띠리

WIN32 SDK에서 시리얼 통신을 하려면...

WinAPI에서는 시리얼 포트도 파일처럼
CreateFile로 파일을 열고
WriteFile로 데이터를 쓰거나
ReadFile로 데이터를 읽거나
CloseHandle로 파일을 닫는다.
일반적으로 파일을 다루는 것과 비슷하지만 시리얼 통신에서는
여기에다가 통신을 하기위한 설정이 필요한다.
SetCommState가 이런한 설정을 하게된다.

시리얼 통신을 하기위한 순서는

1) CreateFile로 파일을 연다.
2) SetCommState함수로 통신포트의 설정을 한다.
3) ReadFile이나 WriteFile로 데이터를 송수신한다.
4) CloseHandle로 파일을 닫는다.


시리얼 통신을 하기위해서는 Windows에서는 HANDLE형의 변수로 파일등의 오브젝트를 구별하여 억세스나 조작을 하게 된다.
이 때 사용하는 시리얼 포트를 특정하기 위해서는 HANDLE형 변수가 필요하다.
다음으로 WinAPI에서는 시리얼 포트의 설정값을 다르는 구조체로서 DCB구조체를 사용한다.
또 시리얼 포트의 타임 아웃 설정값을 다루는 COMMTIMEOUTS구조체가 있다.

Posted by 띠리
플렛폼 SDK

커뮤티케이션

커뮤니케이션의 함수 일람


함수 설명
BuildCommDCB 지정한 DCB구조체에 디바이스 제어 문자열로 지정한 값을 저장한다.
BuildCommDCBAndTimeouts 디바이스 정의 문자열을 다비아스 제어 블럭 코드에 변환한 후, 디바이스 제어 블럭에 저장한다.
ClearCommBreak 지정한 통신 디바이스의 회선이 끊긴 상태를 해제하고 문자 송신을 다시 시작한다.
ClearCommError 통신 에러의 정보를 얻고 통신 디비이스의 현재 상태를 통지한다.
CommConfigDialog 드라이버가 제공하는 설정 다이얼로그 박스를 표시한다.
EscapeCommFunction 지정한 통신 디바이스에 확장 기능을 실행하도록 지시한다.
GetCommConfig 통신 디바이스의 현재 구성을 얻는다.
GetCommMask 지정한 통신 디바이스의 이벤트 마스트의 값을 얻는다.
GetCommModemStatus 모뎀의 제어 레지스터 값을 얻는다.
GetCommProperties 지정한 통신 디바이스의 통신 프로퍼티의 정보를 버퍼에 넣는다.
GetCommState 지정한 통신 디바이스의 현재의 제어 설정을 디바이스 제어 블럭(DCB구조체)에 저장한다.
GetCommTimeouts 지정한 통신 디바이스로 실행 되는 모든 읽고 쓰는 조작의 타임아웃 파라미터를 얻는다.
GetDefaultCommConfig 통신 디바이스의 초기 설정의 구성을 얻는다.
PurgeComm 지정한 통신 자원의 출력 버퍼 또는 입력 버퍼에 있는 모든 문자를 파기한다.
SetCommBreak 지정한 통신 디바이스의 문자송신을 중단하고ClearCommBreak함수가 호출 되어질때 까지 송신 회선을 절단 상태로 한다.
SetCommConfig 통신 디바이스의 현재의 구성을 설정한다.
SetCommMask 특정 통신 디바이스로 감시하는 일련의 이벤트를 설정한다.
SetCommState 디바이스 제어 블럭(DCB구조체)의 지정에 따라서 통신 디바이스를 구성한다.
SetCommTimeouts 지정한 통신 디바이스로 실행되는 모든 읽기 쓰기 조작의 타임아웃을 설정한다.
SetDefaultCommConfig 통신 디바이스의 기본 설정의 구성을 설정한다.
SetupComm 지정한 통신 디바이스의 통신 파라미터를 초기화한다.
TransmitCommChar 지정한 통신 디바이스의 출력 버퍼에 있는 미처리 데이터보다 전에 특정 문자를 송신한다.
WaitCommEvent 지정한 통신 디바이스에서 이벤트가 발생하는 것을 대기한다.
위 링크는 일본 MSDN의 설명이 링크되어 있음

http://msdn2.microsoft.com/en-us/library/aa363194.aspx

위 함수 일람의 영어 설명은 위에 사이트에 기술되어져 있음
Posted by 띠리
Win32 SDK로 만든 간단한 시리얼 통신 예제
한 문자 보내고 받기

컴포트가 COM1로 고정되어있음으로 테스트 할때
바꾸어 주고 다시 빌드해야됨.


// 시리얼 포트 직접 입출력


#include <Windows.h>

#include "resource.h"


BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

DWORD RecvData(LPVOID );            // 수신 전용 스레드


HWND    hWndCopy;                    // 스레드를 위한 핸들의 카피

HANDLE    hFile;                        // 파일 핸들

int        nSwitch;


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst,

                   LPSTR lpszCmdLine, int nCmdShow)

{

    // 다이알로그 표시

    DialogBox(hInst, "DLG_COM", HWND_DESKTOP, (DLGPROC)DlgProc);


    return TRUE;

}


BOOL CALLBACK DlgProc(HWND hWnd, UINT msg,

                      WPARAM wParam, LPARAM lParam)

{

    char szBuffer[200];


    switch(msg){


    case WM_INITDIALOG:


        hWndCopy = hWnd;            // 다이알로그박스 핸들

        nSwitch = 1;


        // 컴포트 열기

        hFile = CreateFile("COM1",

                    GENERIC_READ | GENERIC_WRITE,

                    0,                // 비공유

                    0,                // 시큐리티 속성:사용안함

                    OPEN_EXISTING,    // 기존 파일 오픈

                    0, 0 );            // 속성, 템플레이트


        if(hFile == INVALID_HANDLE_VALUE)

            MessageBox(0, "컴포트 열때 에러났어", "에공", MB_OK);


        DCB                dcb;


        // 지정한 통신 디바이스의 현재 DCB 설정 얻기

        // DCB : Device Control Block 디바이스 제어 블럭

        GetCommState(hFile , &dcb);           


        // 설정을 변경할 때는 코드 추가

        //        :


        // DCB의 지정에 따라 통신 디바이스 구성

        // 하드웨어와 제어 설정 초기화

        SetCommState(hFile , &dcb);           


        wsprintf(szBuffer, "BaudRate %d : ByteSize %d", dcb.BaudRate, dcb.ByteSize);


        // 다이알로그박스 캡션에 BaudRate:ByteSize 사이즈 표시

        SetWindowText(hWnd, szBuffer);


        COMMTIMEOUTS    cTimeout;


        // 현재 설정중인 타임아웃 자료 얻기

        //GetCommTimeouts(hFile, &cTimeout);   


        cTimeout.ReadIntervalTimeout        = 1000;   

        cTimeout.ReadTotalTimeoutMultiplier  = 0;

        cTimeout.ReadTotalTimeoutConstant    = 1000;

        cTimeout.WriteTotalTimeoutMultiplier = 0;

        cTimeout.WriteTotalTimeoutConstant   = 0;


        // 지정한 통신 디바이스의 읽기쓰기 타임아웃 설정

        SetCommTimeouts(hFile, &cTimeout);


        // 수신 스래드 생성하여 스타트

        DWORD            nThreadId;


        // 시리얼 통신 데이터 수신용 스레드 생성

        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvData, NULL, 0, &nThreadId);


        return TRUE;


    case WM_COMMAND:


        switch(LOWORD(wParam)){


        case ID_EDIT_SEND:       


            // 송신쪽 에디트 컨트롤이 변화할 때

            if(HIWORD(wParam) == EN_CHANGE){       


                char szSend[10];


                // 송신쪽 데이터 버퍼에서 읽어오기

                GetDlgItemText(hWnd, ID_EDIT_SEND, szBuffer, sizeof(szBuffer));   


                // 선택 문자 위치 얻기

                int nPos = (int)SendDlgItemMessage(hWnd, ID_EDIT_SEND, EM_GETSEL, 0, 0);


                // 선택 항목 개시 위치

                int nStart = LOWORD(nPos);               

                szSend[0] = szBuffer[nStart - 1];


                DWORD    nByte;


                // 한문자 송신

                WriteFile(hFile, szSend, 1, &nByte, 0);   

            }

            return TRUE;


        case IDCANCEL:


            nSwitch = 0;        // 스래드 종료용


            // 컴포트 닫기

            CloseHandle(hFile);


            // 다이알로그 닫기

            EndDialog(hWnd, 0);


            return TRUE;

        }

    }


    return FALSE;

}

// 읽어오기 전용 스레드

DWORD RecvData( VOID * dummy )                   

{

    DWORD    dwByte;

    char    szRecv[10];

    int        nRet;


    while(nSwitch){


        // 한 문자 수신

        nRet = ReadFile(hFile, szRecv, 1, &dwByte, 0);


        // ReadFile()은 성공하면 0이외를 반환, 타임아웃도 성공

        if(dwByte == 1)

        {

            SetWindowText(hWndCopy, "수신했어");


            SendDlgItemMessage(hWndCopy, ID_EDIT_RECV, WM_CHAR, szRecv[0], NULL);

        }

        else

            SetWindowText(hWndCopy, "수신 대기중");

    }

    return 0;

}




VS2005의 프로젝트로 되어있는 샘플
빌드해서 두 컴퓨터에 시리얼 케이블로 연결한후
윗 텍스트박스에 글자를 입력하면 상대방 어플리케이션에
글자가 하나씩 전송됨
invalid-file

시리얼 통신 간단 예제

Posted by 띠리

VB.NET에서 시리얼 통신하는 정말 간단한 예제
VB.NET은 해본적이 없어서 아직 아는게 별로 없다.
오늘 처음으로 Delgate라는 것을 봤다.
Invoke도 그렇고...

잘은 모르겠지만 예전에 VB6에서는 메세지 박스가 떠있으면
컨트롤은 다른 이벤트가 발생하지 않았다.
그런데 Delgate와 Invoke를 쓰면 메세지 박스가 떠있더라도
메세지를 받을 수 있다.


Imports System.IO.Ports    ' Serial 통신용

Imports System.Threading    ' 쓰레드용


Public Class frmMain


    Private WithEvents ComPort As New System.IO.Ports.SerialPort


    ' Delegate : 대리자를 선언하는 데 사용한다.

    ' 대리자는 형식의 Shared 메서드 또는 개체의 인스턴스 메서드를

    ' 참조하는 참조 형식이다.

    ' 이 대리자 클래스의 인스턴스를 만들기 위해 매개 변수 형식 및

    ' 반환 형식이 일치하는 모든 프로시저를 사용할 수 있다.

    ' 이러한 프로시저는 대리자 인스턴스를 통해 나중에 호출될 수 있다.


    Delegate Sub AddMessageDelegate(ByVal str As String)


    ' 컴포트 열기

    Private Sub cmdConnect_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnConnect.Click


        Try

            ComPort.PortName = "COM" & Trim(txtPort.Text)

            ComPort.BaudRate = 9600

            ComPort.Parity = Parity.None

            ComPort.DataBits = 8

            ComPort.StopBits = StopBits.One


            If (ComPort.IsOpen = True) Then

                MessageBox.Show(ComPort.PortName & "는 벌써 열려져 있는데...", "에러야", _

                MessageBoxButtons.OK, MessageBoxIcon.Error)

                Exit Sub

            End If


            Call ComPort.Open()


            btnConnect.Enabled = False

            btnDisconnect.Enabled = True


        Catch ErrEx As Exception


            MessageBox.Show(ErrEx.Message, "에러야", MessageBoxButtons.OK, MessageBoxIcon.Error)


        End Try

    End Sub


    ' 데이터 수신 이벤트

    Private Sub ComPort_DataReceived(ByVal sender As Object, _

                                ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _

                                Handles ComPort.DataReceived


        Dim addmsg As New AddMessageDelegate(AddressOf AddMessage)

        Dim strDataReceived As String


        Try

            ' 시리얼 통신으로 데이터 수신

            strDataReceived = ComPort.ReadLine


        Catch ex As Exception


            strDataReceived = ex.Message


        End Try


        ' Control.Invoke (Delegate)

        ' 컨트롤의 내부 창 핸들이 들어 있는 스레드에서

        ' 지정된 대리자를 실행한다.

        ' .NET Compact Framework에서 지원된다.


        txtRecv.Invoke(addmsg, New Object() {"RCV>" + strDataReceived})


    End Sub


    ' 텍스트박스 메시지 표시

    Private Sub AddMessage(ByVal str As String)


        txtSend.Text = ""

        txtRecv.Text = DateTime.Now.ToString("HH:mm:ss") + " " + _

                          str + ControlChars.CrLf + _

                          txtRecv.Text

    End Sub


    ' 문자열 송신

    Private Sub btnSend_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnSend.Click


        If (txtSend.Text.Length = 0) Then

            MessageBox.Show("송신 문자열을 입력해 줘", "에러야", _

                            MessageBoxButtons.OK, MessageBoxIcon.Error)

            txtSend.Focus()

            Exit Sub

        End If


        Try

            ' 시리얼 통신으로 데이터 송신

            ComPort.WriteLine(txtSend.Text)

            Call AddMessage("SND>" + txtSend.Text)


        Catch ErrEx As Exception


            MessageBox.Show(ErrEx.Message, "에러", _

                            MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try


    End Sub


    ' 컴포트 닫기

    Private Sub btnDisconnect_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnDisconnect.Click


        btnConnect.Enabled = True

        btnDisconnect.Enabled = False

        Call ComPort.Close()


    End Sub


    Private Sub lblTitle_DoubleClick(ByVal sender As Object, _

                                ByVal e As System.EventArgs) _

                                Handles lblTitle.DoubleClick


        MsgBox("나 메세지 박스야")


    End Sub


End Class



VB8 소스
Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 944,293
Today : 20 Yesterday : 397