Listing 2 (set.c)

/***          SET SERIAL PARAMETERS           ***/

#include "serial.h"

int portbase;

int SetSerial (int ComPort,long Baud,int Parity,
             int DataBits,int StopBits)
{
  if (SetPort(ComPort))
     {
      return (-1);
     }
  
  if (SetBaud(Baud))
     {
      return (-1);
     }

if (SetOthers(Parity,DataBits,StopBits))
     {
      return (-1);
     }

return (0);
}

/***  SET THE PORT VALUE TO CORRECT COM PORT  ***/

int SetPort (int ComPort)
{
  switch (ComPort)
    {
   case COM1:  portbase = COM1BASE;
             break;
   case COM2:  portbase = COM2BASE;
   
             break;
   
   case COM3:  portbase = COM3BASE;
             break;
   
   case COM4:  portbase = COM4BASE;
             break;
   
   default:    return (-1);
   }
  return (0);
}

/***  SET THE BAUD RATE - DLAB MUST BE SET ON.***/

int SetBaud (long Baud)
{
  char Current_Value;
  int divisor;
  
  if ((Baud <= 0) || (Baud > 115200L))
    {
     return (-1);
    }

else
  {
   divisor = (int)(115200L/Baud);
  }

/*** READ CURRENT VALUES IN LINE CONTROL REG   **/
  
  Current_Value = inp(portbase + LCR);
  
  /*** OR CURRENT VALUE WITH 0x80 TO SET DLAB   ***/
    
    outp(portbase + LCR,(Current_Value | DLAB));
  
  /***    OUTPUT BAUD DIVISOR TO LOW BYTE       ***/
    
    outp(portbase + DLL,(divisor & 0x00FF));
  
  /***    OUTPUT BAUD DIVISOR TO HIGH BYTE      ***/
    
    outp(portbase + DLH,((divisor >> 8) & 0x00FF));
  
  /*** TURN DLAB OFF BY SENDING CURRENT VALUE   ***/
    
    outp(portbase + LCR,Current_Value);

return (0);
}

/***    SET PARITY, DATA BITS, AND STOPBITS   ***/

int SetOthers (int Parity,int DataBits,int StopBits)
{
  int setting;
  
  if ((DataBits < 5) || (DataBits > 8))
     
     {
      return (-1);
     }
  
  if ((StopBits != 1) && (StopBits != 2))
     {
      return (-1);
     }
  
  if ((Parity != NO_PARITY) && (Parity != ODD_PARITY)
         && (Parity != EVEN_PARITY))
     {
      return (-1);
     }
  
  setting = DataBits - 5;
  setting |= ((StopBits == 1) ? 0x00 : 0x04);
  setting |= Parity;
  
  outp(portbase + LCR,setting);
  
  return (0);
}

/* End of File */