#include #include //#define COM_DEB 1 #define NUM 1024 //128 #define print printf #define THPRINTF fprintf #define L_DEBUG stderr #ifdef RUN_ON_MIPS #define COM "COM2" #else #define COM "COM1" #endif #define SETTINGS1 lpFilename,9600,8,NOPARITY,ONESTOPBIT #define SETTINGS15 lpFilename,9600,5,NOPARITY,ONE5STOPBITS #define SETTINGS2 lpFilename,4800,8,NOPARITY,ONESTOPBIT #define SETTINGS3 lpFilename,2400,8,NOPARITY,ONESTOPBIT #define SETTINGS4 lpFilename,300,8,NOPARITY,ONESTOPBIT CHAR lpFilename[100]; DWORD dwPacketSize,dwLoop; BOOL DoComIo(LPSTR lpCom,DWORD Baud,BYTE Size,BYTE Parity,BYTE Stop); DWORD main(int argc, char *argv[], char *envp[]) { BOOL bRc; CHAR chDummy; BOOL bFile,bPkt,bLoop; DWORD dwSize,dwSizeHigh,i,j,dwError; HANDLE hFile,hMOFile; LPVOID lpBaseAddress; LPBYTE lpByte; BYTE Byte = 0x00; UNREFERENCED_PARAMETER(envp); bFile = bPkt = bLoop = FALSE; while(argc--) { switch(argv[argc][1]) { case 'f' : case 'F' : { if (argv[argc][0] != '-') break; THPRINTF(L_DEBUG,"comport name option=%s\n\n",argv[argc]); sscanf(argv[argc],"%c %c %s",&chDummy,&chDummy,lpFilename); THPRINTF(L_DEBUG,"com port name =%s\n\n",lpFilename); bFile = TRUE; break; } case 'p' : case 'P' : { if (argv[argc][0] != '-') break; THPRINTF(L_DEBUG,"comport packet size =%s\n\n",argv[argc]); sscanf(argv[argc],"%c %c %d",&chDummy,&chDummy,&dwPacketSize); THPRINTF(L_DEBUG,"com xfer packet size =%d\n\n",dwPacketSize); bPkt = TRUE; break; } case 'l' : case 'L' : { if (argv[argc][0] != '-') break; THPRINTF(L_DEBUG,"comport packet xfer loopcnt =%s\n\n",argv[argc]); sscanf(argv[argc],"%c %c %d",&chDummy,&chDummy,&dwLoop); THPRINTF(L_DEBUG,"com xfer loop cnt =%d\n\n",dwLoop); bLoop = TRUE; break; } default: { break; } } } if (!bFile || !bPkt || !bLoop) { THPRINTF(L_DEBUG,"\n\nOptions are required!!\n\n"); THPRINTF(L_DEBUG,"comtst \n\n"); THPRINTF(L_DEBUG,"options: -f\n\n"); THPRINTF(L_DEBUG,"options: -p\n\n"); THPRINTF(L_DEBUG,"options: -l\n\n"); return (1); } THPRINTF(L_DEBUG,"Doing comtst with com port name=[%s]\n", lpFilename); print("\n\n *** Doing COM TEST with [port=%s Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n", SETTINGS1); bRc = DoComIo(SETTINGS1); if (!bRc) { print("\n\nCOM TEST FAILED********************************\n\n"); } return 0; } BOOL DoComIo(LPSTR lpCom,DWORD Baud,BYTE Size,BYTE Parity,BYTE Stop) { COMMTIMEOUTS CommTimeOuts; CHAR WrBuffer[4096]; CHAR RdBuffer[4096]; DWORD i,l; HANDLE hCommPort; DCB dcb; BOOL bRc; BYTE Byte; DWORD dwNumWritten,dwNumRead,dwErrors; print("\n\n *** COMM TEST START [port=%s,Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n", lpCom,Baud,Size,Parity,Stop); print("Opening the comm port for read write\n"); hCommPort = CreateFile( lpCom, GENERIC_READ|GENERIC_WRITE, 0, // exclusive NULL, // sec attr OPEN_EXISTING, 0, // no attributes NULL); // no template if (hCommPort == (HANDLE)-1) { print("FAIL: OpenComm failed rc: %lx\n",hCommPort); return FALSE; } print("Opening the comm port for read write: SUCCESS hCommPort=%lx\n",hCommPort); print("Setting the line characteristics on comm \n"); //printf("doing getcommstate for priming the dcb with defaults\n"); bRc = GetCommState(hCommPort,&dcb); if (!bRc) { printf("FAIL: getcommstate failed\n"); return FALSE; } dcb.DCBlength = sizeof(DCB); // dcb.DCBversion = 0x0002; BUG BUG in spec not in header dcb.BaudRate = Baud; dcb.ByteSize = Size; dcb.Parity = Parity; dcb.StopBits = Stop; //dcb.RlsTimeout = 10000; 10sec //dcb.CtsTimeout = 10000; 10sec //dcb.DsrTimeout = 10000; 10sec dcb.fBinary = 1; // binary data xmit dcb.fParity = 0; // dont bother about parity dcb.fOutxCtsFlow= 0; // no cts flow control dcb.fOutxDsrFlow= 0; // no dsr flow control dcb.fDtrControl = DTR_CONTROL_DISABLE; // dont bother about dtr dcb.fRtsControl = RTS_CONTROL_DISABLE; // dont bother about dtr dcb.fOutX =0; // disable xoff handling dcb.fInX =0; // disable xon handling dcb.fErrorChar = FALSE; // forget about parity char dcb.ErrorChar = '*'; dcb.fNull = 0; // forget about the null striping dcb.XonChar = 0x0; dcb.XonLim = 0x0; dcb.XoffChar = 0xFF; dcb.XoffLim = 0xFF; dcb.EofChar = 0x00; dcb.EvtChar = 'x'; dcb.wReserved = 0; // mbz dcb.fTXContinueOnXoff = FALSE; // old behaviour dcb.fAbortOnError = FALSE; // old behaviour //dcb.fChEvt = 0; forget about event char bRc = SetCommState(hCommPort,&dcb); if (!bRc) { print("FAIL: cannot set the comm state rc:%lx\n",bRc); bRc = CloseHandle(hCommPort); if (!bRc) { print("FAIL: cannot close the comm port:%lx\n",bRc); } return FALSE; } print("Setting the line characteristics on comm: SUCCESS\n"); print("Setting the read/write timeouts to 5 minutes\n"); CommTimeOuts.ReadIntervalTimeout = 0; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 60*(1000)*5; // 5mins CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 60*(1000)*5; // 5mins bRc = SetCommTimeouts(hCommPort, &CommTimeOuts); printf("bRc from setcommtimeouts = %lx\n",bRc); if (!bRc) { printf("FAIL: setcommtimeouts\n"); } print("Set the read/write timeouts to 5 minutes\n"); print("Filling the buffer with the known chars \n"); Byte = 0; for (i=0; i< dwPacketSize; i++) { //WrBuffer[i] = 'a'; //WrBuffer[i] = (CHAR)i; WrBuffer[i] = Byte; Byte++; } print("Filling the buffer with the known chars : SUCCESS\n"); #ifdef COM_DEB print("Dumping the buffer before sending it to comm\n"); for (i=0; i< dwPacketSize; i++) { //print("%c",RdBuffer[i]); print(" %d ",WrBuffer[i]); } print("\nDumping the buffer before sending it to comm SUCCESS\n"); #endif print("\nLooping %d times doing %d byte packet xfer across %s port\n", dwLoop,dwPacketSize,lpCom); for (l=0; l < dwLoop; l++) { print("Doing....[%d] iteration in the looped pkt xfer.....\n",l); print("Filling the Rdbuffer with the known chars (0xFF) to makeit dirty\n"); for (i=0; i< dwPacketSize; i++) { RdBuffer[i] = '0xFF'; } print("Filling the Rdbuffer with the known chars (0xFF): SUCCESS\n"); print("Writting this buffer to the comm port\n"); bRc = WriteFile( hCommPort, WrBuffer, dwPacketSize, &dwNumWritten, NULL); if (!bRc) { print("FAIL: cannot Write To the comm port:%lx\n",bRc); bRc = CloseHandle(hCommPort); if (!bRc) { print("FAIL: cannot close the comm port:%lx\n",bRc); } return FALSE; } print("Writting this buffer to the comm port: SUCCESS rc:%lx, byteswritten:%lx\n", bRc,dwNumWritten); if (dwNumWritten < dwPacketSize) { print("FAIL: less #bytes written, maybe due to time out, as RC is true\n"); bRc = CloseHandle(hCommPort); if (!bRc) { print("FAIL: cannot close the comm port:%lx\n",bRc); } return FALSE; } print("Flushing this buffer out of comm port\n"); bRc = FlushFileBuffers(hCommPort); print("flush file buffers (%lx) rc = %lx\n",hCommPort,bRc); //bRc = ClearCommError(hCommPort,&dwErrors,NULL); //print("ClearCommError: rc= %lx and dwErrors=%lx\n",bRc,dwErrors); Sleep(1000); print("Calling ReadFile...\n"); bRc = ReadFile( hCommPort, RdBuffer, dwPacketSize, &dwNumRead, NULL); if (!bRc) { print("FAIL: cannot Read From the comm port:%lx\n",bRc); bRc = CloseHandle(hCommPort); if (!bRc) { print("FAIL: cannot close the comm port:%lx\n",bRc); } return FALSE; } print("Reading this buffer from the comm port: SUCCESS rc:%lx, bytesread:%lx\n", bRc,dwNumRead); if (dwNumRead < dwPacketSize) { print("FAIL: less #bytes read, maybe due to time out, as RC is true\n"); bRc = CloseHandle(hCommPort); if (!bRc) { print("FAIL: cannot close the comm port:%lx\n",bRc); } return FALSE; } #ifdef COM_DEB print("Dumping the Rdbuffer with the comm data\n"); for (i=0; i< dwPacketSize; i++) { //print("%c",RdBuffer[i]); print(" %d ",RdBuffer[i]); } print("\nDumping the Rdbuffer with the comm data: SUCCESS\n"); #endif print("Comparing the rd and wr buffers\n"); for (i=0; i< dwPacketSize; i++) { if (RdBuffer[i] != WrBuffer[i]) { print("FAIL: BufferMisMatch: RdBuffer[%d]=%lx,WrBuffer[%d]=%lx\n", i,RdBuffer[i],i,WrBuffer[i]); bRc = CloseHandle(hCommPort); if (!bRc) { print("FAIL: cannot close the comm port:%lx\n",bRc); } return FALSE; } } print("Comparing the rd and wr buffers: SUCCESS\n"); } bRc = FlushFileBuffers(hCommPort); print("flush file buffers (%lx,0) rc = %lx\n",hCommPort,bRc); bRc = ClearCommError(hCommPort,&dwErrors,NULL); print("ClearCommError: rc= %lx and dwErrors=%lx\n",bRc,dwErrors); bRc = PurgeComm(hCommPort,PURGE_TXCLEAR); print("PurgeComm txclear (%lx,0) rc = %lx\n",hCommPort,bRc); bRc = PurgeComm(hCommPort,PURGE_RXCLEAR); print("PurgeComm rxclear (%lx,0) rc = %lx\n",hCommPort,bRc); bRc = PurgeComm(hCommPort,PURGE_RXABORT); print("PurgeComm rxabort (%lx,0) rc = %lx\n",hCommPort,bRc); bRc = PurgeComm(hCommPort,PURGE_TXABORT); print("PurgeComm txabort (%lx,0) rc = %lx\n",hCommPort,bRc); print("Closing the comm port\n"); bRc = CloseHandle(hCommPort); if (!bRc) { print("FAIL: cannot close the comm port:%lx\n",bRc); return FALSE; } print("\n\n*** COMM TEST OVER WITHOUT ERRORS *** \n\n"); }