I have a simple application that I made to test the data rate of a device. I was having trouble with slow communications with another program, so I wrote this one to test just the RS-232 communications. My problem is that I get vastly different result depending upon whether I compile the program as a console application versus a windowed application.
My device is sending 70-byte message packets at 100Hz using 460800 baud, 8-N-1. I'm using a USB to Serial adapter, which is supposed to support that baud rate. Using the console application I get ~7000 bytes/second, which is what I expect. However, when running as a windowed application, I get ~34 bytes/second. Anyone have any ideas about why there is such a vast difference? (CVI 2013 on Win7)
Code is below. Inputs I use are: [COM port number], 460800, 1.
#include <utility.h> #include <ansi_c.h> #include <rs232.h> int main () { FILE * outFile ; FILE * binFile ; int iNumBytes = 0 ; char cMessageArray [720] ; int iStatus ; int iPortNum ; long lBaud ; int iByteRead ; int iGetRate ; char cFileName [20] ; time_t timeStart ; time_t timeStop ; long lByteCount = 0 ; long lTimeoutCount = 0 ; long lNumSeconds = 0 ; printf ( "Port recorder. \nWrites bytes received on the selected port to a file ( {Port #}.txt ).\n\nEnter COM port: " ) ; scanf ( "%i", &iPortNum ) ; printf ( "\nEnter baud rate: " ) ; scanf ( "%u", &lBaud ) ; printf ( "\nEnter 1 to just calculate byte rate: " ) ; scanf ( "%i", &iGetRate ) ; printf ( "\nListening on port %i at baud rate %i (8-N-1) w/half-second timeout. Press any key to stop.\n", iPortNum, lBaud ) ; DisableBreakOnLibraryErrors() ; iStatus = OpenComConfig( iPortNum, "", lBaud, 0, 8, 1, 8192, 1024 ) ; SetComTime ( iPortNum, 0.5 ) ; // COM read timeout in seconds if ( 0 <= iStatus ) { // Open output files sprintf ( cFileName, "%u.txt", iPortNum ) ; outFile = fopen ( cFileName , "wt" ) ; sprintf ( cFileName, "%u.bin", iPortNum ) ; binFile = fopen ( cFileName , "wb" ) ; time ( &timeStart ) ; if ( 1 != iGetRate ) { while ( !KeyHit() ) { iByteRead = ComRdByte( iPortNum ) ; if ( -99 != iByteRead ) // IF not a timeout { iByteRead = iByteRead & 0x00FF ; fprintf( outFile, "%.2X ", iByteRead ) ; printf( "%.2X ", iByteRead ) ; cMessageArray[ iNumBytes ] = (char)( iByteRead & 0x00FF ); iNumBytes++ ; lByteCount++ ; if ( 70 == iNumBytes ) { fwrite ( cMessageArray, 1, 70, binFile ) ; iNumBytes = 0 ; printf( "\n" ) ; } } else { fprintf( outFile, "TIMEOUT " ) ; printf( "TIMEOUT " ) ; lTimeoutCount++ ; } } } else { while ( !KeyHit() ) { iByteRead = ComRdByte( iPortNum ) ; if ( -99 != iByteRead ) // IF not a timeout { lByteCount++ ; } else { lTimeoutCount++ ; } } } time ( &timeStop ) ; lNumSeconds = timeStop - timeStart ; printf ( "Bytes = %i, Seconds = %i, Bytes/Sec. = %f\nTimeouts = %i\n", lByteCount, lNumSeconds, (float)( (float) lByteCount / (float) lNumSeconds), lTimeoutCount ); fflush( outFile ) ; fclose ( outFile ) ; CloseCom( iPortNum ) ; } else { printf ( "Couldn't open COM port!" ) ; } printf ( "\nPress any key to close.\n" ) ; GetKey() ; while ( !KeyHit() ) {} return 0 ; }
Thanks!