- 음악과 나 -/『 짬 통 』

시리얼 포트제어

noon2dy 2006. 5. 16. 13:44

 

 

2001-12-22 오후 2:32:07   /  번호: 3698  / 평점:  (7.0) category: VC++ 일반  /  조회: 6,103 
 시리얼포트 기초..  조경민 / bro  
조경민님께 메시지 보내기  조경민님을 내 주소록에 추가합니다.  조경민님의 블로그가 없습니다  
*별내용없습니다. 시리얼포트제어를 해야 했는데 카드리더기.. 암것도 몰라서 그쪽 하드웨어
사람이랑 말이 안통했습니다 ㅡ_ㅡ;; 그라운드가 뭔지뭐가뭔지. 그래서 할수없이 조금
공부후 정리했었습니다.. 이런거 모르던 알던 상관없이 짜실땐 그냥 코드구루에서 CSerial같은
Serial Comm 통신 클래스 받아다 쓰는게 와땀다.. ㅡ.ㅡ*

오후 1:02 00-01-28
조경민 bro@shinbiro.com

8255, RS232 , IO 포트 , 시리얼 포트 제어 정리
--------------------------------------------------------------------

I/O 포트
컴퓨터에 붙는 주변장치( 프린터, 모뎀, 등등)의 Input Output을 하는 통로
IO포트에는
직렬 포트 ( Serial Port )가 있으며 병렬포트 (Palleral )가 있다

직렬 포트 - 8개의 비트가 하나씩 송수신된다. 느리며, 전송길이가 짧다.(케이블선)
병렬 포트 - 8개의 비트가 한번에 송수신 된다. 빠르며, 전송길이가 길다.

시리얼 포트는 9핀과 24핀짜리가 있는데 9핀은 1~9번 핀을 사용하며 24핀은
2~9번 핀을 사용한다. 나머지는 n/c 노캐리어로 사용 안하고 방치한다.
결국 같은 것이다.

IO 포트 제어에는 어떤 다른 옵션적인 일을 하는것 없이 원초적으로 입력과
출력 함수만 제공된다.
_oup, _inp 을 쓴다.


8255 이란?
-------------------------------------------------------------------
IBM Intel 칩의 이름으로 이 칩이다.

다음 표는 8255에서 쓸수있는 포트 어드레스와 설명이다. 보아야할것은
포트 주소 3F8이 COM1 이라는 것이다.

TABLE 2: EXPANSION SLOT ADDRESSES 
ADDRESS (HEX/DEC) DESCRIPTION ADDRESS (HEX/DEC) DESCRIPTION 
218-21F (536-543) AVAILABLE 390-39F (906-927) AVAILABLE 
250-277 (592-631) AVAILABLE 3AA-3AF (938-943) AVAILABLE 
280-2EF (640-751) AVAILABLE 3B0-3BF (944-959) AVAILABLE 
300-31F (768-799) AVAILABLE 3F8-3FF COM 1 

포트 어드레스 값
----------------------------------------------------------------
port address 
3F8h = COM1
2F8h = COM2
3E8h = COM3
2E8h = COM4

For the standard PC ports, the UART registers are based at 3F8h
(COM1), 2F8h (COM2), 3E8h (COM3), and 2E8h (COM4). COM1 and COM3
share interrupt request line IRQ4 while COM2 and COM4 share request
line IRQ3. This means that COM1 and COM3 can't be used concurrently.
Similarly for COM2 and COM4.


VC의 경우

short _stdcall Out8255( int PortAddress, int PortData )
{
short Dummy; 
// Need Dummy since _outp officially returns int 
// short is a 16-bit integer in Win32 C++
// whereas int is 32-bit integer Win32 C++
// use (short) to force returning 16-bit integer
// back to VB
Dummy = (short)(_outp( PortAddress, PortData ));

return(Dummy);

}; // end of Out8255


통신 방식상 ( RS232, RS485 이란 )
-----------------------------------------------------------------------
RS232는 편리하나 전송 길이가 3M 이내로 제한이 있다.
따라서 긴 케이블이 필요한 경우에는 485통신(1.5km까지)을 해야 한다.
아파트의 경우에는 485 통신으로 각 가정의 컴퓨터의 케이블을 연결하되,
컴퓨터 포트 접지 할때는 RS232로 컨버터를 붙여서 쓴다.

RS485 통신 - Half-Duplex 반이중 통신
RS232 통신 - 전이중 통신


가볼만한 사이트 
-----------------------------------------------------------------
IO 직접 제어관련 사이트
http://www.lvr.com/parport.htm#Programming

IO 제어 Win9x/WinNT용 라이브러리 
ftp://ftp.keithley.com/pub/metrabyte/unsupport/

제어에 관한 프로그래밍 튜토리얼
http://www.boondog.com/


8핀의 정보
------------------------------------------------------------------
pin 정보 ( 9핀짜리라면 각 핀에 있는 선의 기능 )

1 CD ( Carier Dectect ) 데이타 채널 수신 캐리어 검출

2 TD ( Transmit Data ) 송신 보내기 = TX

3 RD ( Receive Data ) 수신 받기 = RX

4 DTR( Data Terminal Ready ) - 터미날 장치 준비

5 SG ( Signal Group ) - 신호용 접지 = GRD

6 DSR ( Data Set Ready ) - 수신 준비 완료

7 RTS ( Request To Send ) - 송신 요구

8 CTS ( Clear To Send ) - 송신 가능 

9 RI ( Ring Indicator ) - 피 호출 표시

1,2,6,8,9 [in]방향
3,4,7 [out] 방향
5 접지( Ground )


흐름 제어
하드웨어 흐름제어 방식 ( RTS /DTS )를 쓴다.
소프트 웨어 흐름 제어 방식 ( XON/XOFF)를 쓴다.


도스에서는 포트를 직접 어드레싱을 할 수 있어서 그것으로 포트에
값을 넣고, 쓰고 했으나 Win에서는 윈도우 운영체제가 관장하게 된다.
따라서 아래의 포트로 도스처럼 직접 쓰고 싶을때에는 따로 
http://www.lvr.com/parport.htm#Programming 에 가서 원하는 라이브러리
를 받아서 직접 포트 제어를 해서 쓸 수 있다.

이 글에 평점 주기:  

 

 

 

 

2002-08-19 오전 10:19:11   /  번호: 4957  / 평점:  (6.5) category: VC++ 일반  /  조회: 16,554 
 첨부파일 있음시리얼 포트제어(1/3) 이용시 / mrlys  
이용시님께 메시지 보내기  이용시님을 내 주소록에 추가합니다.  이용시님의 블로그가 없습니다  
시리얼 포트 제어을 문의하는 글들이 올라와서 이 글을 쓰게 됬습니다.
일단 시리얼 포트를 열고/ 닫는부분에 대해서 설명하겠습니다.
내용은 첨부된 파일을 참조하세요
1. 포트 열기
1) 포트 파일명에 대해서
시리얼 포트는 기본적으로 “COM1”, “COM2”와 같이 파일명이 “COM” + 포트아이디로 구성되어 있습니다.
주의할 점은 시리얼 포트가 10개이상 설치된 PC에서는 “COM10”번부터는 조금 다른게 포트에 접근하여야 한다는 것입니다.
시리얼포트 10번미만은 “COM1”과 같이 파일명을 기술하시면 되구요
시리얼포트 10번이상은 “\\.\\COM10”과 같이 포트명을 기술하셔야 합니다.

2) DCB에 대해서
DCB에는 시리얼 포트를 통한 데이터 통신시 필요한 환경 설정 정보가 저장됩니다.
자세한 내용은 MSDN을 참조하시구요
놓치기 쉬운 것 중에서 몇 가지를 설명하자면

DCB::fNULL 항목을 가지고 binary 또는 text 통신을 설정하게 됩니다.
Binary 통신을 하려면 DCB::fNULL c FALSE : 0x00값을 송수신 가능
Text 통신을 하려면 DCB::fNULL c TRUE : 0x00값 송수신 불가능, 통신시 
데이터를 버려버림

Parity 설정시 NOPARITY(패리티 사용안함)가 아니면 DCB::fParity c TRUE

DCB:: ByteSize : 7 / 8 값만이 유효한 값임
일반적으로 요즘 나오는 RS232 칩들은 8bit를 데이터 1바이트로 인식합니다.
데이터 1바이트 표현시 Parity / Stopbit은 데이터를 구성하는 비트에 포함이 되지 않습니다.
 

3) 시리얼 포트를 열기 위한 절차
- 시리얼 포트 파일명을 만든다.(뭐 하드 코딩하시겠다면 할말이 없지만)
CString strPort = "";
if( nPort < 10 )
        strPort.Format("COM%d", nPort);
else strPort.Format("\\\\.\\COM%d", nPort);
- 시리얼 포트 파일을 연다. (헉 너무 간단한가?)
m_hComm = CreateFile(..);
if( m_hComm == INVALID_HANDLE_VALUE ) 
{
        Close();//시리얼 포트에 접근 못함
        return FALSE;
}
                        -시리얼 포트에 대한 현재 환경설정정보(DCB)를 얻어온다.
DCB dcb; //communication eviroment을 얻어오고 고친다.
    memset( &dcb, 0x00, sizeof( dcb ) );
    dcb.DCBlength = sizeof( dcb );
    if( !GetCommState(m_hComm, &dcb) )
    {//DCB 정보를 얻어오는데 실패함
        Close();
        return FALSE;
    }
- 환경설정정보를 데이터 통신하기 위하여, 수정이 필요하다면 수정한다.
    dcb.BaudRate = nSpeed; //속도 패리티, 바이트 크기, 스탑비트수 세팅
    dcb.Parity    = nParity;
    dcb.fNull    = FALSE;
    if( nParity != NOPARITY ) 
        dcb.fParity = TRUE;
    else dcb.fParity = FALSE;
    dcb.ByteSize= nByteSize;
    dcb.StopBits= nStopBits;
- 수정된 환경설정정보를 저장한다.
    SetCommState( m_hComm, &dcb); //시리얼 포트 환경 세팅 완료
 

- SetCommMask 함수를 이용한 시리얼 포트에서 수신할 이벤트 종류 설정
 SetCommMask( m_hComm, EV_RXCHAR);// RX에 데이터가 수신된 경우에만 이벤트를 받음
- PurgeComm함수를 이용해 시리얼 포트에 남아있는 데이터를 모두 지워버림
 PurgeComm( m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //clear buffer
- ClearCommError 함수를 이용해서 시리얼 포트에 저장된 에러 정보를 지움
DWORD dwCommError = 0;
ClearCommError( m_hComm, &dwCommError, NULL ); //시리얼 포트에 수신된 모든 에러를 초기화함
- COMMTIMEOUTS 구조체를 이용한 데이터 송수신에 대한 Time Out 시간을 설정
그러나, 비동기 통신을 사용하는 경우 데이터가 송신 완료 되는 시점은 알 수 있지만 데이터가 수신되는 시점을 정확히 알 수 없기 때문에 일반적으로 시간 설정을 사용하지 않습니다.
이거 잘 못 사용하면, 프로그램이 가다서다하는 듯한 현상이 발생하기 때문에 개인적으로는 타임아웃 시간 설정하는 것을 추천하지 않습니다.
COMMTIMEOUTS CommTimeOut;
GetCommTimeouts( m_hComm, &CommTimeOut);
CommTimeOut.ReadTotalTimeoutConstant= CommTimeOut.ReadIntervalTimeout= CommTimeOut.ReadTotalTimeoutMultiplier  = MAXDWORD;
SetCommTimeouts( m_hComm, &CommTimeOut ); //타임아웃사용안함설정
- 비동기 통신을 위한 데이터 수신 감시를 위한 쓰레드를 만들기
만드는 이유는 데이터가 수신되는 시점을 정확히 알 수 없기 때문에 쓰레드를 만들어서 데이터가 수신되는 것을 지속적으로 감시를 하여야 합니다.
중요한 것은 데이터가 수신된다고 OS가 발생하는 메시지 숫자와 수신된 데이터의 바이트 크기가 동일 하지 않다는 것입니다.
따라서 메시지가 발생하면 무조건 읽을 수 있을 만큼 최대한 읽어 주어야 합니다.
                            //시리얼 포트를 감시하는 쓰레드 만들기
    DWORD dwThreadId=0;
    m_hThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) 
CommMonitor, this , 0, &dwThreadId);

 

2. 포트 닫기
1) 시리얼 포트 닫기 절차
- 수신 데이터 감시 쓰레드가 있는 경우, 쓰레드를 종료한다.
    ::TerminateThread( m_hThread, dwExitCode );
- 오버랩핑을 사용했다면, 오버랩핑 핸들을 모두 닫는다.
     if( m_ReadOverlap.hEvent  )
    {
        CloseHandle( m_ReadOverlap.hEvent );
        m_ReadOverlap.hEvent = NULL;
    }
    if( m_WriteOverlap.hEvent )
    {
        CloseHandle( m_WriteOverlap.hEvent );
        m_WriteOverlap.hEvent = NULL;
    }
- 시리얼 포트 파일을 닫는다.
if( m_hComm )
    {
        CloseHandle( m_hComm );
        m_hComm = NULL;
    }
이 글에 평점 주기:  
 
  2002-08-19 오전 11:28:36   /  번호: 4958  / 평점:  (-)  
 Re: 잘 읽고 있습니다. 나머지 자료도 빨리~~~ 이호규 / fuckon  
이호규님께 메시지 보내기  이호규님을 내 주소록에 추가합니다.  이호규님의 블로그가 없습니다  
나머지 자료도 빨리 부탁합니다.

그럼 즐거운 하루 되세요.
이 글에 평점 주기:  
  2002-08-19 오후 12:09:00   /  번호: 4960  / 평점:  (-)  
 Re: 저는 타임아웃에서 실패되는데요? 찬찬찬 / chanddag  
찬찬찬님께 메시지 보내기  찬찬찬님을 내 주소록에 추가합니다.  찬찬찬님의 블로그가 없습니다  
COMMTIMEOUTS CommTimeOut;
GetCommTimeouts( m_hComm, &CommTimeOut);
CommTimeOut.ReadTotalTimeoutConstant= CommTimeOut.ReadIntervalTimeout= CommTimeOut.ReadTotalTimeoutMultiplier = MAXDWORD;
SetCommTimeouts( m_hComm, &CommTimeOut ); //타임아웃사용안함설정


이부분에서 SetCommTimeouts함수가 false를 리턴합니다.
이 글에 평점 주기:  
  2002-08-19 오후 12:53:05   /  번호: 4962  / 평점:  (-)  
 Re: 조은글 감사합니다. 질문을 드려도 될런지.. 오탁근 / t7730  
오탁근님께 메시지 보내기  오탁근님을 내 주소록에 추가합니다.  오탁근님의 블로그가 없습니다  
초보라 그러는데여 
수신 스레드 처리는 어덯게 하는건지. 
 포트를 감시하구 있어야 하지 않나여..

 아님 포트에서 이벤트가  EV_RXCHAR 이벤트가 발생하면 스레드를 동작시켜서 
 DATA 를 읽어 드리는 건지..

 이부분에 대한 루틴에 대한 조언좀 부탁드립니다..
 감사합니다 조은글 쓰셔서..
 ^^
이 글에 평점 주기:  
  2002-08-19 오후 12:50:09   /  번호: 4961  / 평점:  (-)  
 Re: 아! 이런 예전에는 안 그랬는데 이용시 / mrlys  
이용시님께 메시지 보내기  이용시님을 내 주소록에 추가합니다.  이용시님의 블로그가 없습니다  
아! 이런 예전에는 안 그랬는데
MSDN에도 0 또는 MAXDWORD 값을 세팅하면 된다고 설명이 나왔건만
MAXDWORD 로 설정하면 네트워크 어탭터에서 에러가 발생한다고 하네요
그래서 0으로 세팅하시면 성공할 겁니다.
언제 바뀌었는지??
아무튼 죄송합니다.
CommTimeOut.ReadTotalTimeoutConstant= CommTimeOut.ReadIntervalTimeout= CommTimeOut.ReadTotalTimeoutMultiplier = MAXDWORD;//MAXDWORD가 아닌 0으로 세팅하세요
==>
CommTimeOut.ReadTotalTimeoutConstant= CommTimeOut.ReadIntervalTimeout= CommTimeOut.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts( m_hComm, &CommTimeOut ); //타임아웃사용안함설정


이부분에서 SetCommTimeouts함수가 false를 리턴합니다.
이 글에 평점 주기:  
  2002-08-19 오후 12:59:17   /  번호: 4963  / 평점:  (7.2)  
 Re: 시리얼 포트 수신 감시 쓰레드 예제 이용시 / mrlys  
이용시님께 메시지 보내기  이용시님을 내 주소록에 추가합니다.  이용시님의 블로그가 없습니다  
DWORD WINAPI CommMonitor( xComm* pComm )
{
    while( pComm->IsOpen() ) //시리얼 포트가 열려있는가?
    {
        DWORD dwEvtMask = EV_RXCHAR | EV_TXEMPTY; //송수신에 대한 이벤트를 받는다.
        WaitCommEvent( pComm->m_hComm, &dwEvtMask, NULL );//이벤트가 발생할때까지 쓰레드여 자라!
        if( dwEvtMask & EV_RXCHAR )  //수신 이벤트 발생
            pComm->OnReceiveData(); //
        if( dwEvtMask & EV_TXEMPTY )//송신 완료 이벤트 발생
            EscapeCommFunction( pComm->m_hComm, CLRRTS | SETDTR); //set RST line be low
    }
    return 0;
}
이 글에 평점 주기:  

 

 

 

 

2002-08-20 오전 10:14:32   /  번호: 4973  / 평점:  (6.0) category: VC++ 일반  /  조회: 9,917 
 첨부파일 있음시리얼포트제어(2/3) 이용시 / mrlys  
이용시님께 메시지 보내기  이용시님을 내 주소록에 추가합니다.  이용시님의 블로그가 없습니다  
이번에는 데이터 입출력에 대한 글을 올리구요
다음에는 간단하게 프로그램을 만들어서 약간의 팁과 시리얼 포트 제어 대한 글을 마치겠습니다.
즐플하세요
시리얼 포트를 통한 데이터 입출력
1. 데이터 출력
1) 절차
- 오버랩을 사용하는 경우
오버랩을 초기화한다.
OVERLAPPED:: Offset = OVERLAPPED::OffsetHigh = 0;
OVERLAPPED::Offset : 전송할 데이터의 시작 위치
OVERLAPPED::OffsetHigh: 이것은 네임드파이프 또는 통신디바이스에 대해서는 무조건 0으로 세팅(시리얼포트도 통신디바이스이므로 0 으로 세팅)
- 데이터 전송
    DWORD dwWriteSize = 0;
    if(!WriteFile(m_hComm, pData, dwSize, &dwWriteSize, &m_WriteOverlap ))
    {//데이터 전송실패시
        DWORD dwError = GetLastError();//최신 에러코드를 얻는다.
        while(dwError==ERROR_IO_PENDING||dwError== ERROR_IO_INCOMPLETE )
        {//입출력 대기 상태 이거나, 선행 입출력이 종료되지 않았으면
            if(GetOverlappedResult( m_hComm, &m_WriteOverlap, &dwWriteSize, TRUE ) )
            {//오버랩을 이용하여 데이터 전송
                return dwWriteSize;//오버랩 출력이 종결되면 전송한 데이터 크기를 리턴한다.
            }
            dwError = GetLastError();
        }
        COMSTAT State;
        ClearCommError( m_hComm, &dwError, &State );//시리얼포트에서 발생한 에러 초기화
    }
 

2. 데이터 입력
1) 절차
- ClearCommError()함수를 이용하여 수신된 에러를 초기화하고, 수신버퍼에
얼마만큼의 데이터가 수신되었는지 확인하고, 수신하고자 하는 데이터량과 비교하여 수신하고자하는 값을 다시 설정한다.(무지 설명이 길지만 코드는)
COMSTAT State;
ClearCommError( m_hComm, &dwReadSize, &State );
if( State.cbInQue < dwSize ) dwSize = State.cbInQue ;

- 오버랩을 사용하는 경우
OVERLAPPED:: Offset = OVERLAPPED::OffsetHigh = 0;
OVERLAPPED::Offset : 전송할 데이터의 시작 위치
OVERLAPPED::OffsetHigh: 이것은 네임드파이프 또는 통신디바이스에 대해서는 무조건 0으로 세팅(시리얼포트도 통신디바이스이므로 0 으로 세팅)
- 수신된 데이터를 읽는다.
    if( !ReadFile( m_hComm, pData, dwSize, &dwReadSize, &m_ReadOverlap ) )
    { //데이터 읽기를 실패하면
        DWORD dwError = GetLastError();//최근에 발생한 에러코드를 얻는다.
        while( dwError == ERROR_IO_PENDING || dwError == ERROR_IO_INCOMPLETE )
        {// 입출력 대기 상태 이거나, 선행 입출력이 종료되지 않았으면
            if( GetOverlappedResult( m_hComm, &m_ReadOverlap, &dwReadSize, TRUE ) )
            {//오버랩을 이용하여 데이터 전송
                return dwReadSize; ;//오버랩 출력이 종결되면 전송한 데이터 크기를 리턴한다
            }
            dwError = GetLastError();
        }
        COMSTAT State;
        ClearCommError( m_hComm, &dwError, &State );
    }
 

3. 입력 감시 쓰레드
            간단하게 소스만을 소개하겠습니다.
            DWORD WINAPI CommMonitor( xComm* pComm )
            {
                    while( pComm->IsOpen() ) //시리얼포트가 열려 있을 때까지만 쓰레드가 동작한다.
                    {
                        //데이터 수신 및 전송완료 이벤트를 받겠다고 설정
                        DWORD dwEvtMask = EV_RXCHAR | EV_TXEMPTY;
                        //이벤트가 발생할 때까지 쓰레드를 재운다
                        WaitCommEvent( pComm->m_hComm, &dwEvtMask, NULL );
                        if( dwEvtMask & EV_RXCHAR ) //데이ㅓ 수신이벤트 발생
                            pComm->OnReceiveData();
                        if( dwEvtMask & EV_TXEMPTY )//데이터 전송완료 이벤트 발생
                            EscapeCommFunction( pComm->m_hComm, CLRRTS | SETDTR); //set RST line be low
                    }
                    return 0;
            }
이 글에 평점 주기:  
 
  2002-08-20 오후 9:00:17   /  번호: 4984  / 평점:  (-)  
 Re: 질문 한가지 한민웅 / mwhan  
한민웅님께 메시지 보내기  한민웅님을 내 주소록에 추가합니다.  한민웅님의 블로그가 없습니다  
올리신글 고맙게 잘 보았습니다.
마지막 3편이 기대됩니다.

글을 읽다가 궁금한 점이 있어서 글을 올립니다.

포트 오픈시
...
dcb.fDtrControl = DTR_CONTROL_DISABLE;
...
dcb.fRtsControl = RTS_CONTROL_ENABLE;
...
DTR은 DISABLE, RTS는 ENABLE하는 이유가 궁금하구요.

DTR이 DISABLE상태에서 수신 감시 쓰레드에서
EscapeCommFunction( pComm->m_hComm, CLRRTS | SETDTR); //set RST line be low
SETDTR을 하는 이유가 궁금합니다.

그럼, 수고하세요.
이 글에 평점 주기:  
  2002-08-21 오후 1:38:20   /  번호: 5002  / 평점:  (-)  
 Re: [질문]최고 속도는? 김강주 / apexer  
김강주님께 메시지 보내기  김강주님을 내 주소록에 추가합니다.  김강주님의 블로그가 없습니다  

말씀 하신 방법대로 하면 얼마의 속도까지 지원해 주나요?

필요한것은 115200BPS 가 지원이 되어야 되서요..

실제 작성하신 프로그램으로 테스트 해보시고 답변 좀 부탁 드립니다.
이 글에 평점 주기:  
  2002-08-20 오후 11:45:54   /  번호: 4985  / 평점:  (-)  
 Re: 아! 그거여 죄송 이용시 / mrlys  
이용시님께 메시지 보내기  이용시님을 내 주소록에 추가합니다.  이용시님의 블로그가 없습니다  
강좌를 올리면서 새롭게 코드를 작성한 것이 아니라요
기존에 RTS선을 제어가 필요한 프로그램을 작성한 것을 배껴서 그래요
다음번 강좌올릴 때는 소스코드에다가 가급적 자세한 설명을 달아서 올리겠습니다.
소스가 완벽하지 않지만 흐름만을 이해하시면 될 것 같습니다.
다음번 강좌는 다음 주에나 올리 것 같네요
샘플 프로그램 만들고, 테스트하고, 코멘트 달고,
간단한 팁도 포함해서 완결하려구해서 ^^;;
즐플하세요
이 글에 평점 주기:  
  2002-08-21 오후 1:43:43   /  번호: 5003  / 평점:  (-)  
 Re: 그건여! UART에 따라서 틀려요 이용시 / mrlys  
이용시님께 메시지 보내기  이용시님을 내 주소록에 추가합니다.  이용시님의 블로그가 없습니다  
PC에서 모뎀에 연결하지 않고, 시리얼 포트로 직접 데이터를 송수신하는 경우
가능합니다.
다만 시리얼 포트에 모뎀을 연결하면, 모뎀 속도에 좌우되죠
이 글에 평점 주기:  
  2005-04-14 08:25:00
 Re: 슬픔 시리얼포트제어(2/3)...  방극찬 / sos_clinic@hotmail.com  
방극찬님께 메시지 보내기  방극찬님을 내 주소록에 추가합니다.  방극찬님의 블로그가 없습니다.  
첨부파일이 제대로 안열어지는데요... 저만 그런건가요? ㅡㅡ;
  2005-05-03 10:19:00
 Re: 화남 시리얼포트제어(2/3)...  Choizzang / dragoncsy  
Choizzang님께 메시지 보내기  Choizzang님을 내 주소록에 추가합니다.  Choizzang님의 블로그가 없습니다.  
첨부파일이 안열림!!!!
  2005-11-25 11:14:00
 Re: 슬픔 시리얼포트제어(2/3)...  박정란 / maru77a  
박정란님께 메시지 보내기  박정란님을 내 주소록에 추가합니다.  박정란님의 블로그가 없습니다.  
문서 다시 올려주심 좋겠는데..--;

 

2005-01-26 오전 11:33:11   /  번호: 7019  / 평점:  (5.3) category: VC++ 일반  /  조회: 4,414 
 USB2Serial을 이용한 시리얼 통신시 유의사항 박준철 / warawara  
박준철님께 메시지 보내기  박준철님을 내 주소록에 추가합니다.  박준철님의 블로그가 없습니다  
일반 COM1, COM2, USB2Serial(USB1.1)에서는 잘 되는데...
USB2Serial(USB2.0)에서는 잘 안되네요...
하는 문제점을 접하면서
몇년을 묵혀뒀던 시리얼 포트 코드를 다시 꺼내봐야 한다는 고통은 참 남다릅니다.


하이퍼 터미널은 되는데, 내가만든 시리얼 포트 프로그램에선 안되는 현상...
특히, 다 잘되는데 USB2.0지원 케이블 부터 안되는 현상...

이런 일이 닥쳤을 때, 
"하이퍼 터미널"로 열어본 다음  그 DCB를 확인하면 되겠지... 라고 생각하시겠지만
실제 하이퍼 터미널은 자기가 시리얼 포트를 열때 기존 값을 oldDCB로 백업해 놓구, 
사용한 후 닫을 때는 다시 원래 값으로 복원시켜 놓기에
자칫 하이퍼 터미널이 설정한 값이 이 DCB구나 하고 오해하실 수 있습니다.


하이퍼 터미널로 열었을 때의 시리얼 핀의 사용상태를 직접 확인한 후 
우리 프로그램에서도 그렇게 시리얼 핀의 사용상태를 만들어 주면 됩니다.


핀은 9핀 콘넥터라고 가정을 하고요...
5번 핀이 그라운드 입니다.

4번 핀과 5번 핀을 계측기로 찍었을 때 High Volt(+8V)인지 Low Volt(-8V)인지 확인하세요!
4번 핀이 +8V이면 dcb.fDtrControl 값을 DTR_CONTROL_ENABLE로 설정하세요!

7번 핀과 5번 핀을 계측기로 찍었을 때 High Volt(+8V)인지 Low Volt(-8V)인지 확인하세요!
7번 핀이 +8V이면 dcb.fRtsControl 값을 RTS_CONTROL_ENABLE로 설정하세요!

(지적해주셔서 고맙습니다. 정정합니다. 그라운드 5번핀 ^^;)

그럼 수고들 하세요~!
이 글에 평점 주기:  
  2005-01-26 12:51:00
 Re: 좋음 USB2Serial을 이용한 시리얼 ...  이대희 / powerat  
이대희님께 메시지 보내기  이대희님을 내 주소록에 추가합니다.  이대희님의 블로그가 없습니다.  
그라운드는 5번핀인데요.
  2005-01-28 14:37:00
 Re: 난감 USB2Serial을 이용한 시리얼 ...   청깨고르 / Psycho00  
청깨고르님께 메시지 보내기  청깨고르님을 내 주소록에 추가합니다.  청깨고르님의 블로그가 없습니다.  
음음... 저..저두.. 그런 경험이...

시리얼로는 잘 되던게.. USB2Serial 을 사용하니깐. 제대루 안되더라는..ㅡㅡ;;

근데.. PPA 에서는 잘 받더라구요...

그..근데.. 제 프로그램에서는 잘 안 받아지구...
수신 데이터가.. 일부..손실된다는...ㅡㅡ;;

그..근데.. 케이블 핀 상태에 따라서.. DTR 과 RTS 를 Enable 로 설정만 하면 되나여???

좀 알켜주시면...ㅡㅡ;;;
  2005-02-15 11:57:00
 Re: 좋음 USB2Serial을 이용한 시리얼 ...  홍성민 / soribi  
홍성민님께 메시지 보내기  홍성민님을 내 주소록에 추가합니다.  홍성민님의 블로그가 없습니다.  
윗분들 저와 비슷하군요 데스크에 붙어있는거 쓸때는 이상없더니 USB붙여서 쓰니 좀
까먹어서 몇가지 수정을 했더니 잘되던데
timeouts.ReadIntervalTimeout = 1; <--- 이부분 수정했어요
혹 안되시는분 바꿔서 테스트 해보세요 너무 심하게 조정하면 데이터 받을때 무지 늦어지니까 적당히~~~~ 그믄 수고하세요
  2005-03-04 11:18:00
 Re: 좋음 USB2Serial을 이용한 시리얼 ...  조용길 / mutter21  
조용길님께 메시지 보내기  조용길님을 내 주소록에 추가합니다.  조용길님의 블로그가 없습니다.  
가끔은요 USB2Serial을 제작한 업체의 펌웨어에 문제가 있는 경우도 있답니다. 우울하죠. =(

 

 

2000-02-14 오전 10:40:05   /  번호: 266  / 평점:  (3.5) category: ETC  /  조회: 5,017 
 [추천] RS-232C Serial Communication 에관한 레퍼런스 백영현 / yhbaek  
백영현님께 메시지 보내기  백영현님을 내 주소록에 추가합니다.  백영현님의 블로그가 없습니다  
제가 이번에 COM port 2개에 받은 데이터를 처리해야 되서 이쪽으로 심도 있게 공부하려고 좀 찾아봤는데 역시 MSDN 에서 나온 레퍼런스가 좋더군여.. 그래서 여기에 추천드립니다. 국내에서는 아마 번역본도 나왔을거 같습니다.

The information in this article applies to:

Microsoft C for MS-DOS, versions 6.0, 6.0a, and 6.0ax 
Microsoft C/C++ for MS-DOS, version 7.0 
Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5

--------------------------------------------------------------------------------
The following books may be useful to programmers doing serial communications programming with Microsoft C and C++: TITLE Serial Communications in C and C++ (Includes Disk) 
AUTHOR Mark Goodwin 
PUBLISHER MIS Press 
ISBN 1-55828-203-3 
TITLE C Programmer's Guide to Serial Communications 
AUTHOR Joe Campbell 
AUTHOR Howard W. Sams & Company 
ISBN 0-672-22584-0 


TITLE Windows Programmer's Guide to Serial Communications (Includes Disk) 
AUTHOR Timothy S. Monk 
AUTHOR SAMS Publishing 
ISBN 0-672-30030-3 


TITLE Mastering Serial Communications 
AUTHOR Peter Gofton 
AUTHOR Sybex 
ISBN 0-89588-180-2 


TITLE Serial Communication: A C++ Developer's Guide 
AUTHOR Mark Nelson 
AUTHOR M & T Books 
ISBN 1-55851-281-0 

 

 

 

'- 음악과 나 - > 『 짬 통 』' 카테고리의 다른 글

캐릭터 쩜프  (0) 2006.05.17
시리얼시리얼 소프트  (0) 2006.05.17
시리얼 통신..  (0) 2006.05.16
5월 16일 . 수업시간.  (0) 2006.05.16
5월 9일 겜 프로그래밍 시간  (0) 2006.05.09