home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / communic / rsutil / setcom.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-04  |  2.8 KB  |  88 lines

  1. /*==================================================
  2. Funktion SETCOM. Setzt der Parameter der seriellen
  3. Schnittstellen COM1 - COM4. Keine Überprüfung, ob
  4. die angewählte Schnittstelle wirklich existiert.
  5. ===================================================*/
  6.  
  7. #include "baudtab.h"         /* Einbinden der Baudraten-Tabelle */
  8.  
  9. int setcom(int com,long baud,int dbit,int sbit,char *par);
  10.  
  11. int setcom(com,baud,dbit,sbit,par)
  12.  
  13. int com,dbit,sbit;
  14. long baud;
  15. char *par;
  16.  
  17. {
  18.  int combd;
  19.  int comlcr;
  20.  unsigned char     bdlow    = 0;
  21.  unsigned char     bdhigh = 0;
  22.  unsigned char     parity = 0;
  23.  unsigned char     datab    = 0;
  24.  unsigned char     stopb    = 0;
  25.  unsigned char     mode    = 0;
  26.  int i;
  27.  int far *combasis;
  28.  unsigned char far *maxcom;
  29.  int commax;
  30.  
  31.  FP_SEG(maxcom) = 0x0040;
  32.  FP_OFF(maxcom) = 0x0011;        /* Anzahl COM-Schnittstellen    */
  33.  commax = (*maxcom & 0x0e) >> 1;    /* aus Equipmentword isolieren    */
  34.  
  35.  if( (com > commax) || (com < 1) )    /* Abbruch, wenn Schnittstelle    */
  36.     return(1);                /* nicht vorhanden ist        */
  37.  
  38.  FP_SEG(combasis) = 0x0040;
  39.  FP_OFF(combasis) = (com - 1) * 2;    /* Ermitteln der Divisor-Latch- */
  40.  combd      = *combasis;            /* Register Adresse        */
  41.  comlcr   = combd + 3;            /* Adresse Line-Control-Reg.    */
  42.  
  43.  for (i=0 ; i<BDMAX ; i++)        /* Divisor-High- und Div.-Low-    */
  44.    {                    /* Bytes in Tabelle suchen    */
  45.      if (baud == bd[i][0])
  46.       {
  47.        bdhigh = bd[i][1];
  48.        bdlow  = bd[i][2];
  49.       }
  50.    }
  51.  if ( (bdlow == 0) && (bdhigh == 0) )    /* Baudrate nicht implementiert */
  52.   {
  53.     printf("\nUnzulässige Baudrate \n");
  54.     return(2);                /* Abbruch mit ERRORLEVEL 2    */
  55.   }
  56.  
  57.  dbit -= 5;                /* Parameter für Anzahl der    */
  58.  if ( (dbit >=0) && (dbit <= 8) )    /* Daten-Bits ermitteln        */
  59.    datab = dbit;
  60.   else                    /* Falscher Wert übergeben !    */
  61.    return(3);                /* Abbruch mit ERRORLEVEL 3    */
  62.  
  63.  if (sbit == 1)                /* Parameter für Anzahl der    */
  64.      stopb = 0;                /* Stop-Bits ermitteln        */
  65.    else if (sbit == 2)
  66.        stopb = 4;
  67.      else                /* Falscher Wert übergeben !    */
  68.      return(4);            /* Abbruch mit ERRORLEVEL 4    */
  69.  
  70.  par[1] = '\0';                /* Parameter für Parität    */
  71.  if (stricmp(par,"N") == 0)        /* Nur erstes Zeichen auswerten */
  72.       parity = 0x00;            /*!----------------------------!*/
  73.   else if (stricmp(par,"O") == 0)    /*!  An dieser Stelle wird ein !*/
  74.       parity = 0x08;            /*!   Großbuchstabe erwartet   !*/
  75.    else if (stricmp(par,"E") == 0)    /*!----------------------------!*/
  76.       parity = 0x18;
  77.     else                /* Parameter nicht erlaubt !    */
  78.       return(5);            /* Abbruch mit ERRORLEVEL 5    */
  79.  mode = datab | stopb | parity;        /* Parameter über OR verknüpfen */
  80.  
  81.  outp(comlcr,0x80);            /* Divisor-Byte-Low ansprechen    */
  82.  outp(combd, bdlow);            /* Divisor-Low schreiben    */
  83.  outp(combd+1,bdhigh);            /* Divisor-High schreiben    */
  84.  outp(comlcr, mode);            /* Start-,Stop-,Paritybits    */
  85.  
  86.  return(0);
  87. }
  88.