40 #define _CRT_SECURE_NO_WARNINGS 1 
   63 #define SDH_RS232_VCC_DEBUG 1 
   65 #if SDH_RS232_VCC_DEBUG 
   94 cRS232::cRS232(  
int _port, 
unsigned long _baudrate, 
double _timeout, 
char const* _device_format_string )
 
   98     _hCOM(INVALID_HANDLE_VALUE),
 
  104     SetTimeout( _timeout );
 
  109     if (
_hCOM != INVALID_HANDLE_VALUE)
 
  119     char device[] = 
"\\\\.\\COM00"; 
 
  120     sprintf(device, 
"\\\\.\\COM%d", 
port+1);
 
  121     DBG( 
dbg << 
"cRS232-vcc::Open: Opening RS232 device '" << device << 
"', baudrate: " << 
baudrate << 
"\n" );
 
  123     _hCOM = CreateFileA(device,                        
 
  124                         GENERIC_READ | GENERIC_WRITE,  
 
  129                         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
 
  131                         FILE_ATTRIBUTE_NORMAL,         
 
  134     if ( 
_hCOM == INVALID_HANDLE_VALUE )
 
  137 #if SDH_RS232_VCC_ASYNC 
  138     memset(&o, 0, 
sizeof(OVERLAPPED));
 
  142     dcbInitState.DCBlength = 
sizeof( DCB );
 
  144     rc = GetCommState(
_hCOM, &dcbInitState);
 
  147     dcbInitState.DCBlength = 
sizeof( DCB );
 
  149     dcbInitState.fBinary = 1;
 
  150     dcbInitState.fParity = 0;
 
  151     dcbInitState.fOutxCtsFlow = 0;
 
  152     dcbInitState.fOutxDsrFlow = 0;
 
  153     dcbInitState.fDtrControl = DTR_CONTROL_DISABLE;
 
  154     dcbInitState.fDsrSensitivity = 0;
 
  155     dcbInitState.fTXContinueOnXoff = 1;
 
  156     dcbInitState.fOutX = 0;
 
  157     dcbInitState.fInX = 0;
 
  158     dcbInitState.fErrorChar = 0;
 
  159     dcbInitState.fNull = 0;
 
  160     dcbInitState.fRtsControl = RTS_CONTROL_DISABLE;
 
  161     dcbInitState.fAbortOnError = 0;
 
  162     dcbInitState.ByteSize  = 8;
 
  163     dcbInitState.Parity    = NOPARITY;
 
  164     dcbInitState.StopBits = ONESTOPBIT;
 
  165     rc = SetCommState(
_hCOM, &dcbInitState);
 
  180     _hCOM = INVALID_HANDLE_VALUE;
 
  185   DBG( 
dbg << 
"cRS232-vcc::SetTimeout( " << _timeout << 
")\n" );
 
  186   if ( 
_hCOM != INVALID_HANDLE_VALUE )
 
  191       if ( _timeout < 0.0 )
 
  198       else if ( _timeout == 0.0 )
 
  209           comm_timeouts.ReadTotalTimeoutConstant   = DWORD( _timeout * 1000.0 ); 
 
  220 ssize_t 
cRS232::Read( 
void *data, ssize_t 
size, 
long timeout_us, 
bool return_on_less_data )
 
  222     char* buffer = (
char*) data;
 
  232 #if SDH_RS232_VCC_ASYNC 
  233         memset(&o, 0, 
sizeof(OVERLAPPED));
 
  234         o.hEvent = CreateEvent(
NULL, FALSE, FALSE, 
NULL);
 
  235         rc = ReadFile(
_hCOM, buffer + offset, 
size-offset, &bytes_read, &o); 
 
  237         rc = ReadFile(
_hCOM, buffer + offset, 
size-offset, &bytes_read, 
NULL ); 
 
  241 #if SDH_RS232_VCC_ASYNC 
  242             DWORD last_error = GetLastError();
 
  243             if ( last_error == ERROR_IO_PENDING )
 
  246                 if(return_on_less_data)
 
  247                     nRetVal = WaitForSingleObject(o.hEvent, 10);
 
  249                     nRetVal = WaitForSingleObject(o.hEvent, 5000);
 
  255                     DBG( 
dbg << 
"cRS232-vcc::Read: WAIT_TIMEOUT bytes_read = " << bytes_read << 
"\n" );
 
  256                     CloseHandle(o.hEvent);
 
  262                 std::cerr << 
"error " << last_error << 
" from ReadFile / GetLastError: " << 
GetLastErrorMessage() << 
"\n";
 
  268         DBG( 
dbg << 
"cRS232-vcc::Read: Read " << bytes_read << 
"/" << 
size << 
" bytes (hex): " << 
cHexByteString( buffer + offset, bytes_read ) << 
"\n" );
 
  269         if ( bytes_read == 0 )
 
  271              if ( timeout_us == 0 )
 
  275              DBG( 
dbg << 
"cRS232-vcc::Read timeout! bytes_read = 0\n" );
 
  276 #if SDH_RS232_VCC_ASYNC 
  277              CloseHandle(o.hEvent);
 
  281 #if SDH_RS232_VCC_ASYNC 
  282         CloseHandle(o.hEvent);
 
  284         offset += bytes_read;
 
  287     } 
while( offset < (DWORD) 
size );
 
  289     return (ssize_t) offset;
 
  294     memset(line, 0, 
size*
sizeof(
char));
 
  300 #if SDH_RS232_VCC_ASYNC 
  301         memset(&o, 0, 
sizeof(OVERLAPPED));
 
  302         o.hEvent = CreateEvent(
NULL, FALSE, FALSE, 
NULL);
 
  303         rc = ReadFile(
_hCOM, &line[offset], 1, &bytes_read, &o);
 
  305         rc = ReadFile(
_hCOM, &line[offset], 1, &bytes_read, 
NULL);
 
  309 #if SDH_RS232_VCC_ASYNC 
  310             DWORD last_error = GetLastError();
 
  311             if ( last_error == ERROR_IO_PENDING )
 
  314                 if(return_on_less_data)
 
  315                     nRetVal = WaitForSingleObject(o.hEvent, 10);
 
  317                     nRetVal = WaitForSingleObject(o.hEvent, 5000);
 
  328                 std::cerr << 
"error " << last_error << 
" from ReadFile / GetLastError: " << 
GetLastErrorMessage() << 
"\n";
 
  334         if ( bytes_read == 0 )
 
  337 #if SDH_RS232_VCC_ASYNC 
  338         CloseHandle(o.hEvent);
 
  340         offset += bytes_read;
 
  343     } 
while(line[offset-1] != eol[0]);
 
  351         len = 
static_cast<int>(strlen(ptr));
 
  355 #if SDH_RS232_VCC_ASYNC 
  357     o.hEvent = CreateEvent(
NULL, FALSE, FALSE, 
NULL);
 
  358     rc = WriteFile(
_hCOM, (LPCVOID)ptr, len, &dwWritten, &o);
 
  360     rc = WriteFile(
_hCOM, (LPCVOID)ptr, len, &dwWritten, 
NULL );
 
  365     DBG( 
dbg << 
"cRS232::write wrote " << len << 
"/" << dwWritten << 
" bytes (hex): " << 
cHexByteString( ptr, len ) << 
"\n" );
 
  377 void cRS232::Open(
int port, 
unsigned long baudrate, 
double timeout)
 
  388     std::cout << 
"EOL size=" << strlen(eol) << std::endl;
 
  389     if(return_on_less_data)
 
  392     return "cRS232::readline";
 
  399     std::cout << 
">>> " << ptr << std::endl;