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

C++빌더 Q&A
C++Builder Programming Q&A
[35486] Re:시리얼통신 질문[송신할때 딜레이]
posix.duo [posix] 2236 읽음    2004-06-08 19:16
도스 모드에서 시리얼 통신을 하려고 하신다면 송신도 수신과 마찬가지로 인터럽트를
사용하는 것이 좋습니다.

저의 경우, 95년도인가 이후로 도스 프로그래밍으 한 적이 없어서 잘 기억은 안나지만
백업소스를 찾아보니 아래와 같은 루틴을 작성하여 PC 3대와 LCD PANDANT를 통신했던
코드가 있더군요...

아래에 보이는 코드는 LCD PANDANT와 통신했던 프로그램의 송수신 인터럽트 루틴입니다.

송신(lcd_tx)을 보시면 쉽게 이해가 될겁니다.

도움이 되시기를....

/*******************************************************************/
void  interrupt far lcd_rx( void )
{
    d_rxtemp= inportb( siod );
    switch( d_rxtemp ){
        case 0x82 : d_rxstat= 1;
                    d_rxcnt= 0;
                    break;
        case 0x83 : d_rxstat= 0;
                    d_rxfg= 1;
                    break;
        default   :
            if( a_rxstat<5 )    d_rxbuf[d_rxcnt++]= d_rxtemp;
            else                d_rxstat= 0;
    }
    outportb(0x80,0xed);
    outportb(0x80,0x4d);
}
/*----------------------------------------------------------------------------*/
void  interrupt  far lcd_tx( void )
{
    if( d_txstat==1 ) {
        outportb( siod, d_txbuf[d_txptr++] );
        d_txcnt--;
        if( d_txcnt==0 )    d_txstat= 0;
    }
    else    outportb( siod+1, 0x28 );

    outportb(0x80,0xed);
    outportb(0x80,0x4d);
}
/*----------------------------------------------------------------------------*/
void  interrupt far lcd_ext( void )
{
    outportb(0x80,0xed);
    outportb(0x80,0x4d);
}
/*----------------------------------------------------------------------------*/
void interrupt far lcd_spec( void )
{
    outportb( siod+1, 0x30 );
    outportb( 0x80,0xed );
    outportb( 0x80,0x4d );
}
/******************************************************************************/

이일형 님이 쓰신 글 :
: 안녕하세요. 시리얼 통신 송신 질문 드립니다.
: 프로그래밍은 제 전공이 아니라 워낙 초짜 입니다. 그래서 C 만 사용합니다. -_-
: 일단 데이터를 받는건 인터럽트를 사용하여 잘 하고 있는데 송신이 문제 입니다.
: 여러 사이트에서 찾아 봤는데 C 이외의 언어는 (C++도 -_-) 잘 이해를 못하기 때문에 좋은 소스를 찾아도 알 수 없고 대충 예제 프로그램은 제가 올려 놓은 것과 별반 다를게 없습니다.
: 아래와 같이 프로그램을 짜서 사용하고 있는데요. 일단 송신을 잘 됩니다.
:
: 문제는 UART에 여러 문자를 보낼때 while(!(inportb(comport+LSR) & TX_EMPTY)); 루틴이 문제인듯 합니다.
: 9600bps로 세팅하고 초당 900바이트 정도의 데이터를 송신하는데 CPU 점유율이 높습니다.
: 다른 작업을 병행하고 통신포트를 6개 이상 사용해야하므로 CPU 점유율을 낮추어야 합니다. 
: 아마 전에 송신하던 문자가 송신이 되기를 기다리느라 while 문이 많이 반복되는 듯합니다.
: 제가 생각하기에 delay(), sleep() 함수를 while문 안에 넣으면 될꺼 같은데 그 방법이 맞는지요.
: 그리고 delay(), sleep()를 써서 잠시 지연을 시킨다면 지연하는 시간이
: 보레이트와 관계가 있을 듯합니다. 혹시 위의 방법이 맞다면 보레이트별로 지연시간이
: 어느정도가 적당한지 알고 싶습니다. 보레이트는 9600에서 115200까지 두루 사용하게 될듯 합니다.
:
:
: void Send_data(unsigned char ch,unsigned int comport)
:   {
:    while(!(inportb(comport+LSR) & TX_EMPTY));  //TX FIFO가 빌때까지 기다린다
:    outportb(comport+THR, ch);
:   }
:

+ -

관련 글 리스트
35458 시리얼통신 질문[송신할때 딜레이] 이일형 1960 2004/06/07
35486     Re:시리얼통신 질문[송신할때 딜레이] posix.duo 2236 2004/06/08
35487         Re:Re:답변 감사드립니다. 이일형 1001 2004/06/08
35475     Re:잘은 모르겠지만..... 몇자만 적어 봅니다. 꿈꾸는빛.영준 1156 2004/06/08
35459     Re:시리얼통신 질문[송신할때 딜레이] 김상면 1641 2004/06/08
35467         Re:Re:시리얼통신 질문[송신할때 딜레이] 이일형 1163 2004/06/08
35473             Re:Re:Re:시리얼통신 질문[송신할때 딜레이] 김상면 1257 2004/06/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.