/***************************************************
* Comunicação direta com a porta serial através da *
* programação da UART                              *
****************************************************

#include <stdio.h>
#include <unistd.h>
#include <termios.h>

#define COM0 0x3f8     //para COM1, COM2 usar 0x2f8
#define TAXA 115200L   //bps
#define PARIDADE 0     //0=nenhuma, 1 = ímpar, 2=par
#define STOP 1         //1 stop bit
#define BITS_DADOS     //8 bits de dados
#define TRUE 1 

void inicializa( unsigned int, long, int, int, int);

int kbhit(void) {
    int c ;

    tcsetattr(STDIN_FILENO,TCSANOW,&new_attr);
    c = getchar() ; /* retorna EOF se nada foi pressionado */
    tcsetattr(STDIN_FILENO,TCSANOW,&old_attr);

    return c ;
}

int main(){
    int status;
    unsigned char ch;
    inicializa(COM0, TAXA, PARIDADE, STOP, BITS_DADOS);
    while (TRUE){
		if(kbhit()){ //se tecla pressionada
			ch=getch(); //lê char
			outportb(COM0, ch); //envia char
		}
		status=inport(COM0+5); //LSR
		if((status&1)){ //dados disponíveis?
			ch = inportb(COM0);
			if(ch='\r') { //se carriage return
				putch('\r');
				putch('\n');
			}
			else           //se outro caractere   
				putch(ch); //imprime caractere
		}	
	}
	return 0;
}

/* inicializa() */
/***************************************************
* Inicializa porta serial com os parâmetros        *
* enviados como argumentos                         *
***************************************************/
void inicializa(unsigned porta, 
			   long bps, //bits por segundo - taxa 
			             //de transmissão
			   int p, //paridade - 0=nenhuma
			          //1=ímpar, 2 = par
			   int stop, //1 ou dois stop bits 
			   int bitsDados){ //7 ou 8 bits de dados
    
	union{
		unsigned int nr;
		unigned char hilo[2];
	} divisor;
	unsigned char byteDeParam;
	int LCR=porta+3,
        DLL= porta,
        DLM =porta+1;
        //LSR =porta+5;

	//calcula o valor para ser enviado para registradores
	//de taxa de transmissão
	divisor.nr = (unsigned int) (1843200L/(bps*16L));
	
    //Liga bit (seta) do registrador de controle de caract. (LCR)
	//para permitir o acesso ao registradores da taxa de transmissão
	outportb(LCR,0x80); ////0x80=1000.0000b

    //envia os dois bytes da taxa de transmissão para 
    //devidas portas
	//Byte menos significativo para porta 
	outportb(DLL, divisor.hilo[0]);//DLL
	//Byte mais significativo para porta
	outportb(DLM, divisor.hilo[1]);//DLM
	
    //Formata byte de parâmetro
    //0000.0011 8 bits de dados
               
	bitsDados -=5;   //8-5 = 3 = 0000.0011b   
	stop = (stop-1)<<2; //manda para o bit 2, se stop == 1 stop << 4 == 0000.0100b
    
	if(p)//se 1 ou 2
		p=((p-1)<<4) | 0x08;  //(p-1)==1, (p-1)<< 4 == 0001.0000b
                              // 0001.0000b | 0000.1000b == 0001.1000b   
	
	//Envia byte de parâmetro para registrador de 
	//controle de linha
    byteDeParam = p | stop | bitsDados;//000.1000b | 0000.0100b | 0000.0011 = 0000.1111b
	outportb(LCR, byteDeParam);//LCR
}


	
	
	
	

