|
도스 모드에서 시리얼 통신을 하려고 하신다면 송신도 수신과 마찬가지로 인터럽트를
사용하는 것이 좋습니다.
저의 경우, 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);
: }
:
|