43 #include <sys/select.h> 
   44 #include <sys/ioctl.h> 
   72 #define SDH_RS232_CYGWIN_DEBUG 1 
   78 #if SDH_RS232_CYGWIN_DEBUG 
  102     char* dup = 
new char[strlen( s ) + 1];
 
  103     return strcpy( dup, s );
 
  107 cRS232::cRS232( 
int _port, 
unsigned long _baudrate, 
double _timeout, 
char const* _device_format_string ) :
 
  111     device_format_string( _device_format_string ),
 
  112     baudrate( _baudrate ),
 
  126     DBG( 
dbg << 
"Opening RS232 device '" << std::string(device) << 
"', baudrate: " << 
baudrate << 
"\n" );
 
  128     fd = open( device, O_RDWR | O_NOCTTY | O_NDELAY );
 
  155     io_set_new.c_cflag |=  CLOCAL;    
 
  156     io_set_new.c_cflag |=  HUPCL;     
 
  157     io_set_new.c_cflag |=  CREAD;     
 
  158     io_set_new.c_cflag &= ~PARENB;    
 
  159     io_set_new.c_cflag &= ~CSTOPB;
 
  160     io_set_new.c_cflag &= ~CSIZE;
 
  161     io_set_new.c_cflag |=  CS8;
 
  162     io_set_new.c_cflag &= ~CRTSCTS;   
 
  163     io_set_new.c_cflag &= ~CBAUD;     
 
  168     io_set_new.c_oflag &= ~OPOST;     
 
  172     io_set_new.c_iflag &= ~INPCK;     
 
  173     io_set_new.c_iflag |=  IGNPAR;    
 
  174     io_set_new.c_iflag &= ~ISTRIP;    
 
  176     io_set_new.c_iflag &= ~(IXON | IXOFF | IXANY); 
 
  177     io_set_new.c_iflag |=  IGNBRK;    
 
  178     io_set_new.c_iflag &= ~BRKINT;    
 
  179     io_set_new.c_iflag &= ~INLCR;     
 
  180     io_set_new.c_iflag &= ~IGNCR;     
 
  181     io_set_new.c_iflag &= ~ICRNL;     
 
  182     io_set_new.c_iflag &= ~IUCLC;     
 
  183     io_set_new.c_iflag &= ~IMAXBEL;   
 
  188     io_set_new.c_lflag &= ~ICANON;   
 
  189     io_set_new.c_lflag &= ~ECHO;     
 
  190     io_set_new.c_lflag &= ~ECHOE;    
 
  191     io_set_new.c_lflag &= ~ISIG;     
 
  220     io_set_new.c_cc[VMIN] = 1;
 
  221     io_set_new.c_cc[VTIME]= 0;
 
  227     if (tcsetattr(
fd,TCSANOW,&io_set_new) < 0)
 
  263     case 3000000: 
return B3000000;
 
  266     case 2500000: 
return B2500000;
 
  269     case 2000000: 
return B2000000;
 
  272     case 1500000: 
return B1500000;
 
  275     case 1152000: 
return B1152000;
 
  278     case 1000000: 
return B1000000;
 
  281     case 921600: 
return B921600;
 
  284     case 576000: 
return B576000;
 
  287     case 500000: 
return B500000;
 
  290     case 460800: 
return B460800;
 
  293     case 256000: 
return B256000;
 
  296     case 230400: 
return B230400;
 
  298     case 115200: 
return B115200;
 
  299     case 57600:  
return B57600;
 
  300     case 38400:  
return B38400;
 
  301     case 19200:  
return B19200;
 
  302     case 9600:   
return B9600;
 
  303     case 4800:   
return B4800;
 
  304     case 2400:   
return B2400;
 
  305     case 1800:   
return B1800;
 
  306     case 1200:   
return B1200;
 
  307     case 600:    
return B600;
 
  308     case 300:    
return B300;
 
  309     case 200:    
return B200;
 
  310     case 150:    
return B150;
 
  311     case 134:    
return B134;
 
  312     case 110:    
return B110;
 
  334     DBG( 
dbg << 
"cRS232::write wrote " << len << 
"/" << written << 
" bytes (hex):" << 
cHexByteString( ptr, written ) << 
"\n" );
 
  341 ssize_t 
cRS232::Read( 
void *data, ssize_t 
size, 
long timeout_us, 
bool return_on_less_data )
 
  350     char*       buffer =(
char*) data;
 
  351     long        max_time_us = timeout_us;
 
  352     if ( max_time_us <= 0 )
 
  367         if ( max_time_us >= 0)
 
  369             us_left = max_time_us - start_time.
Elapsed_us();
 
  370             time_left.tv_sec  = us_left / 1000000;
 
  371             time_left.tv_usec = us_left % 1000000;
 
  373             if (time_left.tv_sec <= 0 && time_left.tv_usec < 1 )
 
  375                 time_left.tv_sec  = 0;
 
  376                 time_left.tv_usec = 1;
 
  379             timeout_p = &time_left;
 
  393         struct  timeval timeout_maybe_overwritten = *timeout_p;
 
  394         select_return = select( 
fd+1, &fds, 
NULL, 
NULL, &timeout_maybe_overwritten );
 
  397         if ( select_return < 0 )
 
  404         else if (select_return > 0)
 
  407             if (return_on_less_data)
 
  410                 bytes_read_inc = read( 
fd, buffer + bytes_read, 
size - bytes_read );
 
  413                 if (bytes_read_inc < 0)
 
  420                 DBG( 
dbg << 
"cRS232::Read: Read " << bytes_read_inc << 
"/" << (
size-bytes_read) << 
" bytes (hex): " << 
cHexByteString( buffer+bytes_read, bytes_read_inc ) << 
"\n" );
 
  422                 if (bytes_read_inc>0)
 
  424                     bytes_read+=bytes_read_inc;
 
  425                     if (bytes_read==
size)
 
  445                 int irc = ioctl( 
fd, TIOCINQ, &bytes_read_inc );
 
  458                     if (bytes_read_inc>=
size)
 
  460                         if ((bytes_read = read( 
fd, data, 
size )) < 0)
 
  469                             DBG( 
dbg << 
"cRS232::Read: Read " << bytes_read << 
"/" << 
size << 
" bytes (hex): " << 
cHexByteString( (
char const*) data, bytes_read ) << 
"\n" );
 
  481             if (return_on_less_data)
 
  488     while ( timeout_us < 0 || start_time.
Elapsed_us() < (
long) max_time_us );