#include #include #include #include #include #include #define MAX_XMT 128 #define MAX_RCV 128 #define CARRIAGE_RETURN 0x0D #define LINE_FEED 0x0A #define SERIAL_WAIT 0 #define SERIAL_RCV_1 1 #define SERIAL_RCV_2 2 main( int argc , char *argv[] ) { HANDLE hComDev1 , hComDev2 ; COMSTAT ComStat1 , ComStat2 ; ULONG dwError1 , dwError2 ; ULONG nToRead1 , nToRead2 , nActuallyRead1 , nActuallyRead2 ; int iPort1 , iPort2 ; long lSpeed ; UCHAR in1[MAX_RCV] , in2[MAX_RCV] ; char stmp[16] ; ULONG i ; int currentPort ; int port_a_state , port_b_state ; char szPort1[8] , szPort2[8] ; FILE *fp ; DCB dcbSerialParams = {0} ; printf("\nSCADAmetrics Dual Serial Port Snooper III\n\n"); if ( argc != 4 ) { printf("Incorrect Number of Command-Line Parameters: %d\n",argc); printf("Usage: Snooper3.exe COMa COMb baud\n"); return(0); } // lSpeed = 9600L ; lSpeed = atol( argv[3] ) ; currentPort = 1 ; port_a_state = SERIAL_WAIT ; port_b_state = SERIAL_WAIT ; fp = NULL ; // Setup COMa... // ============= iPort1 = atoi( argv[1] ) ; sprintf( szPort1 , "COM%d" , iPort1 ) ; hComDev1 = CreateFile( szPort1 , GENERIC_READ | GENERIC_WRITE , 0 , 0 , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , 0 ) ; if ( hComDev1 != INVALID_HANDLE_VALUE ) { dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if ( GetCommState(hComDev1,&dcbSerialParams) ) { switch (lSpeed ) { case 1200L : { dcbSerialParams.BaudRate=CBR_1200; break ; } case 2400L : { dcbSerialParams.BaudRate=CBR_2400; break ; } case 4800L : { dcbSerialParams.BaudRate=CBR_4800; break ; } case 9600L : { dcbSerialParams.BaudRate=CBR_9600; break ; } case 19200L : { dcbSerialParams.BaudRate=CBR_19200; break ; } case 38400L : { dcbSerialParams.BaudRate=CBR_38400; break ; } case 57600L : { dcbSerialParams.BaudRate=CBR_57600; break ; } default : { dcbSerialParams.BaudRate=CBR_9600; break ; } } dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; if (!SetCommState(hComDev1, &dcbSerialParams)) { printf("Error setting COMa state\r\n"); return(0); } } } else { printf("Error opening COMa.\r\n"); return(0); } // Setup COMb... // ============= iPort2 = atoi( argv[2] ) ; sprintf( szPort2 , "COM%d" , iPort2 ) ; hComDev2 = CreateFile( szPort2 , GENERIC_READ | GENERIC_WRITE , 0 , 0 , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , 0 ) ; if ( hComDev2 != INVALID_HANDLE_VALUE ) { dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if ( GetCommState(hComDev2,&dcbSerialParams) ) { switch (lSpeed ) { case 1200L : { dcbSerialParams.BaudRate=CBR_1200; break ; } case 2400L : { dcbSerialParams.BaudRate=CBR_2400; break ; } case 4800L : { dcbSerialParams.BaudRate=CBR_4800; break ; } case 9600L : { dcbSerialParams.BaudRate=CBR_9600; break ; } case 19200L : { dcbSerialParams.BaudRate=CBR_19200; break ; } case 38400L : { dcbSerialParams.BaudRate=CBR_38400; break ; } case 57600L : { dcbSerialParams.BaudRate=CBR_57600; break ; } default : { dcbSerialParams.BaudRate=CBR_9600; break ; } } dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; if (!SetCommState(hComDev2, &dcbSerialParams)) { printf("Error setting COMb state\r\n"); return(0); } } } else { printf("Error opening COMb.\r\n"); return(0); } fp = fopen( "data.txt" , "wt" ) ; if ( fp==NULL ) { printf("Error opening data file.\r\n"); return(0); } while (!_kbhit()) { if ( currentPort == 1 ) { Sleep(10); ClearCommError( hComDev1 , &dwError1 , &ComStat1 ) ; nToRead1 = ComStat1.cbInQue ; if ( nToRead1 > 0 ) { if ( port_a_state == SERIAL_WAIT ) { port_a_state = SERIAL_RCV_1 ; printf("\r\n\nCOMa: "); fprintf(fp,"\r\n\nCOMa: "); } else { port_a_state = SERIAL_RCV_1 ; } ReadFile( hComDev1 , in1 , (DWORD)nToRead1 , &nActuallyRead1 , NULL ) ; for ( i=0 ; i 3 ) { port_a_state = SERIAL_WAIT ; currentPort = 2 ; } } } } else { Sleep(10); ClearCommError( hComDev2 , &dwError2 , &ComStat2 ) ; nToRead2 = ComStat2.cbInQue ; if ( nToRead2 > 0 ) { if ( port_b_state == SERIAL_WAIT ) { port_b_state = SERIAL_RCV_1 ; printf("\r\n\nCOMb: "); fprintf(fp,"\r\n\nCOMb: "); } else { port_b_state = SERIAL_RCV_1 ; } ReadFile( hComDev2 , in2 , (DWORD)nToRead2 , &nActuallyRead2 , NULL ) ; for ( i=0 ; i 3 ) { port_b_state = SERIAL_WAIT ; currentPort = 1 ; } } } } } fflush(fp); fclose(fp); return(1); }