Hello Everyone,
In my app, I need to detect the device connected to PC via Serial port. In my code, I am checking for all communication port available on PC at 8 different Baudrates. Here is the code below.
HANDLE hComHandle;
char szBaudRate[][7] = {"9600","38400", "115200", "57600",
"19200", "4800", "2400", "1200"};
char cCommand[][3] = {"k" ,"~k"};
char SerialNumberCommand[][4] = {"Ks" ,"~Ks"};
char cProduct [ ][10] = {"Kproduct", "~Kproduct"} ;
int nPortNum;
int nTmp;
int nControlChar;
WCHAR szPortName[10];
char cReadBuffer;
char cReadModel[20] = {"Apache"};
char cReadSerialNumber [ 22 ];
DWORD lpNumberOfBytesWritten = 0;
DWORD lpNumberOfBytesRead = 0;
int nSerialPortPrinter = 0;
int nPortNumber = 0;
int nCounter = 0;
int nFlag = 0;
DCB dcbConfig;
COMMTIMEOUTS commTimeout;
for (nPortNum = 0; nPortNum < m_nSerialPorts; nPortNum++ )
{
MultiByteToWideChar (CP_ACP, 0, cPortNames [nPortNum],
sizeof(cPortNames[nPortNum]),
szPortName, sizeof (cPortNames [nPortNum]));
for ( nTmp = 0; nTmp < 8; nTmp++ )
{
hComHandle = CreateFileW ((LPCWSTR)szPortName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if ( hComHandle == INVALID_HANDLE_VALUE)
{
break;
}
if(!SetupComm(hComHandle, 1024, 1024))
{
continue;
}
if(GetCommState(hComHandle, &dcbConfig))
{
dcbConfig.BaudRate = (DWORD)atoi (szBaudRate [ nTmp ]);
dcbConfig.ByteSize = 8;
dcbConfig.Parity = NOPARITY;
dcbConfig.StopBits = 0;
dcbConfig.fBinary = TRUE;
dcbConfig.fParity = TRUE;
}
else
continue;
if(!SetCommState(hComHandle, &dcbConfig))
continue;
if(GetCommTimeouts(hComHandle, &commTimeout))
{
commTimeout.ReadIntervalTimeout = 50;
commTimeout.ReadTotalTimeoutConstant = 50;
commTimeout.ReadTotalTimeoutMultiplier = 0;
commTimeout.WriteTotalTimeoutConstant = 50;
commTimeout.WriteTotalTimeoutMultiplier = 0;
}
else
continue;
if(!SetCommTimeouts(hComHandle, &commTimeout))
continue;
for (nControlChar = 0; nControlChar < 2; nControlChar++)
{
Sleep ( 2 );
WriteFile (hComHandle, cCommand [nControlChar],
2, &lpNumberOfBytesWritten, NULL );
Sleep ( 5 );
ReadFile (hComHandle, &cReadBuffer, 1, &lpNumberOfBytesRead, NULL);
if (lpNumberOfBytesRead > 0 && cReadBuffer == 'Y' )
{
nFlag = 1;
}
}
}
}
This code works smoothly on 32 Bit Platforms but not on 64 Bit platform. Functions such as SetupComm(),GetCommState(), SetCommState(), SetCommTimeOutS() fails.