#include <windows.h>
#include <stdio.h>

#define NUM     128

DWORD main(int argc, char *argv[], char *envp[])
{
CHAR chBuffer[128];
CHAR RdBuffer[128];
DWORD UseBaud = 9600;
WORD i;
HANDLE hCommPort;
DCB    dcb;
BOOL   bRc;
DWORD  dwNumWritten,dwNumRead,dwErrors;

envp;

if (argc > 1)
    {
    sscanf(argv[1],"%d",&UseBaud);
    }


printf("\n\n *** COMM TEST START ***\n\n");

printf("Opening the comm port for read write\n");

hCommPort = CreateFile(
                       "COM1",
                       GENERIC_READ|GENERIC_WRITE,
                       0, // exclusive
                       NULL, // sec attr
                       OPEN_EXISTING,
                       0,             // no attributes
                       NULL);         // no template

if (hCommPort == (HANDLE)-1)
    {
    printf("FAIL: OpenComm failed rc: %lx\n",hCommPort);
    return -1;
    }


printf("Opening the comm port for read write: SUCCESS hCommPort=%lx\n",hCommPort);

printf("Setting the line characteristics 9600,8,N,1 on comm \n");

dcb.DCBlength   = sizeof(DCB);
// dcb.DCBversion  = 0x0002; BUG BUG in spec not in header


if (!GetCommState(hCommPort,&dcb))
    {
    printf("FAIL: Couldn't get the dcb: %d\n",GetLastError());
    return FALSE;
    }

dcb.BaudRate = UseBaud;

dcb.ByteSize = 8;
dcb.Parity   = NOPARITY;
dcb.StopBits = ONESTOPBIT;

bRc = SetCommState(hCommPort,&dcb);

if (!bRc)
    {
    printf("FAIL: cannot set the comm state rc:%lx\n",bRc);
    return -1;
    }

printf("Setting the line characteristics 9600,8,N,1 on comm: SUCCESS\n");


printf("Filling the buffer with the known chars \n");

for (i=0; i< NUM; i++)
    {
    //chBuffer[i] = 'a';
    chBuffer[i] = (CHAR)i;

    }

printf("Filling the buffer with the known chars : SUCCESS\n");

printf("Dumping the buffer before sending it to comm\n");

for (i=0; i< NUM; i++)
    {
    //printf("%c",RdBuffer[i]);
    printf(" %d ",chBuffer[i]);

    }

printf("\nDumping the buffer before sending it to comm SUCCESS\n");



printf("Filling the Rdbuffer with the known chars (0xFF) to makeit dirty\n");

for (i=0; i< NUM; i++)
    {
    RdBuffer[i] = 0xFF;
    }

printf("Filling the Rdbuffer with the known chars (0xFF): SUCCESS\n");

printf("Writting this buffer to the comm port\n");

bRc = WriteFile( hCommPort,
                 chBuffer,
                 NUM,
                &dwNumWritten,
                 NULL);

if (!bRc)
        {
        printf("FAIL: cannot Write To the comm port:%lx\n",bRc);
        return -1;
        }

printf("Writting this buffer to the comm port: SUCCESS rc:%lx, byteswritten:%lx\n",
                                                     bRc,dwNumWritten);


printf("Reading this buffer from the comm port\n");

bRc = ReadFile( hCommPort,
                RdBuffer,
                NUM,
               &dwNumRead,
                NULL);

if (!bRc)
        {
        printf("FAIL: cannot Read From the comm port:%lx\n",bRc);
        return -1;
        }

printf("Reading this buffer from the comm port: SUCCESS rc:%lx, bytesread:%lx\n",
                                                     bRc,dwNumRead);


printf("Dumping the Rdbuffer with the comm data\n");

for (i=0; i< NUM; i++)
    {
    //printf("%c",RdBuffer[i]);
    printf(" %d ",RdBuffer[i]);

    }

printf("\nDumping the Rdbuffer with the comm data: SUCCESS\n");


printf("Closing the comm port\n");


bRc = ClearCommError(hCommPort,&dwErrors,NULL);

printf("ClearCommError: rc= %lx and dwErrors=%lx\n",bRc,dwErrors);


bRc = CloseHandle(hCommPort);

if (!bRc)
    {
        printf("FAIL: cannot close the comm port:%lx\n",bRc);
        return -1;
    }


printf("\n\n*** COMM TEST OVER*** \n\n");
return 0;
}