home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / PCWK996.iso / polskie / orhmet / dfdisk / rlibc / rs232.c < prev    next >
C/C++ Source or Header  |  1996-02-28  |  3KB  |  151 lines

  1. #include <dos.h>
  2. #include "rs_defs.ch"
  3.  
  4. #define XON            5
  5. #define XOFF        6
  6.  
  7. #define SET_RTS    (outportb( COM_Adr+4, inportb( COM_Adr+4) | 2 ))
  8. #define CLR_RTS (outportb( COM_Adr+4, inportb( COM_Adr+4) & 0xfd ))
  9. #define CTS (inportb(COM_Adr+6)&0x10)
  10.  
  11. #define ISTIMEOUT(ticks,timeout)    \
  12. ( ( mk_ticks() + (ticks+timeout>=1092?1092/2:0) )%1092 >\
  13. (ticks+timeout + (ticks+timeout>=1092?1092/2:0) )%1092 )
  14.  
  15. #define TIMEOUT (3*18);
  16.  
  17. unsigned int rs232_timeout;
  18.  
  19. unsigned int COM_Adr;
  20.  
  21. void set_timeout ( int timeout )
  22. {
  23.     rs232_timeout=timeout;
  24. }
  25.  
  26.  
  27. int get_timeout ( void )
  28. {
  29.     return (rs232_timeout);
  30. }
  31.  
  32. unsigned int mk_ticks ( void )
  33. {
  34.     unsigned long wynik;
  35.  
  36.     _AH=0x00;
  37.     asm    int 1ah;            /*odczytanie systemowego licznika czasu*/
  38.     wynik=(_CX<<16)+_DX;
  39.     wynik%=65543L;            /*ile reszty z godzin*/
  40.     return((unsigned int)(wynik%1092L));    /*ile reszty z minut*/
  41. }
  42.  
  43. unsigned char HandShake(void)
  44. {
  45.     unsigned int pocz;
  46.  
  47.     pocz = mk_ticks();
  48.     while ( CTS && !ISTIMEOUT( pocz, rs232_timeout) );
  49.     if ( CTS )
  50.     {
  51.         CLR_RTS;
  52.         return(0);
  53.     }
  54.     SET_RTS;
  55.     while ( !CTS && !ISTIMEOUT( pocz, rs232_timeout) );
  56.     if ( !CTS )
  57.     {
  58.         CLR_RTS;
  59.         return( 0 );
  60.     }
  61.     return(1);
  62. }
  63.  
  64. unsigned char SendPortB( unsigned char byte)
  65. {
  66.     if (!HandShake())
  67.         return(0xff);
  68.     outportb( COM_Adr, byte );
  69.     while( !(inportb( COM_Adr+5 ) & 0x20) );
  70.     CLR_RTS;
  71.     return(byte);
  72. }
  73.  
  74. unsigned char RecvPortB(void)
  75. {
  76.     unsigned char byte;
  77.     unsigned int pocz;
  78.  
  79.     if (!HandShake())
  80.         return(0xff);
  81.     pocz = mk_ticks();
  82.     while ( !(inportb( COM_Adr+5 )&1) )
  83.         if (ISTIMEOUT( pocz, rs232_timeout) )
  84.         {
  85.             CLR_RTS;
  86.             return(0xff);
  87.         }
  88.     byte = inportb( COM_Adr );
  89.     CLR_RTS;
  90.     return(byte);
  91. }
  92.  
  93. int recvport( unsigned char no, char *str )
  94. {
  95.     unsigned char i=0,a;
  96.  
  97.     do
  98.     {
  99.         a = RecvPortB();
  100.         if ( a == 0xff )
  101.             return( -1 );
  102.         if ( a == XOFF )
  103.             return( -1 );
  104.     } while ( a != XON );
  105.     while ( i < no )
  106.     {
  107.         if ((a = RecvPortB())==0xff)
  108.             return( -1 );
  109.         if ( a == XOFF )
  110.             return( -1 );
  111.         str[i++] = (char )a;
  112.     }
  113.     return(1);
  114. }
  115.  
  116. int sendport( unsigned char no, char *str )
  117. {
  118.     unsigned int i=0;
  119.  
  120.     if ( SendPortB( XON )==0xff )
  121.         return( -1 );
  122.     while ( i < no )
  123.         if (SendPortB( (char )str[i++] )==0xff)
  124.         {
  125.             SendPortB( XOFF );
  126.             return(-1);
  127.         }
  128.     return(1);
  129. }
  130.  
  131. int initport( unsigned int adr)
  132. {
  133.     char tmp[3];
  134.  
  135.     COM_Adr = adr;
  136.     outportb( COM_Adr+3, 0x80 );
  137.     outportb( COM_Adr, 12 );
  138.     outportb( COM_Adr+1, 0 );
  139.     outportb( COM_Adr+3, 3 );
  140.     outportb( COM_Adr+1, 0 );
  141.     outportb( COM_Adr+4, 0 );
  142.     rs232_timeout = TIMEOUT;
  143.     CLR_RTS;
  144.     tmp[0] = 'X';
  145.     tmp[1] = 'X';
  146.     tmp[2] = 0;
  147.     sendport( 2, tmp );
  148.     if ( recvport( 2, tmp )==-1 )
  149.         return(0);
  150.     return(1);
  151. }