29 Dec 2015
Reading data from multiple COM serial ports part I
I downloaded CSerialCom.cpp class from following link – A Simple Class for Implementing Serial Communication in Win-9X/2000 and modified it as follow to handle multiple communication ports.
Here is SerialCom.h header file.
#include atlstr.h class CSerialCom { // Construction public: CSerialCom(); // Attributes public: // Operations public: // Implementation public: void ClosePort(); BOOL ReadByte(BYTE &resp); BOOL WriteByte(BYTE bybyte); BOOL OpenPort(CString portname); BOOL SetCommunicationTimeouts(DWORD ReadIntervalTimeout,DWORD ReadTotalTimeoutMultiplier,DWORD ReadTotalTimeoutConstant,DWORD WriteTotalTimeoutMultiplier,DWORD WriteTotalTimeoutConstant); BOOL ConfigurePort(DWORD BaudRate,BYTE ByteSize,DWORD fParity,BYTE Parity,BYTE StopBits); HANDLE hComm; DCB m_dcb; COMMTIMEOUTS m_CommTimeouts; BOOL m_bPortReady; BOOL bWriteRC; BOOL bReadRC; DWORD iBytesWritten; DWORD iBytesRead; DWORD dwBytesRead; virtual ~CSerialCom(); };
SerialCom.cpp : implementation file is here
#include "SerialCom.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////// // CSerialCom CSerialCom::CSerialCom() { } CSerialCom::~CSerialCom() { } ///////////////////////////////////////////////////////////////////////////// // CSerialCom message handlers BOOL CSerialCom::OpenPort(CString portname) { portname= "//./" +portname; hComm = CreateFile(portname, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if(hComm==INVALID_HANDLE_VALUE){ printf("Cannot open Communication Port.Please\nQuit the program and Re-start your PC."); return false;} else return true; } BOOL CSerialCom::ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity, BYTE Parity, BYTE StopBits) { if((m_bPortReady = GetCommState(hComm, &m_dcb))==0){ printf("GetCommState Error","Error",MB_OK+MB_ICONERROR); CloseHandle(hComm); return false;} m_dcb.BaudRate =BaudRate; m_dcb.ByteSize = ByteSize; m_dcb.Parity =Parity ; m_dcb.StopBits =StopBits; m_dcb.fBinary=TRUE; m_dcb.fDsrSensitivity=false; m_dcb.fParity=fParity; m_dcb.fOutX=false; m_dcb.fInX=false; m_dcb.fNull=false; m_dcb.fAbortOnError=TRUE; m_dcb.fOutxCtsFlow=FALSE; m_dcb.fOutxDsrFlow=false; m_dcb.fDtrControl=DTR_CONTROL_DISABLE; m_dcb.fDsrSensitivity=false; m_dcb.fRtsControl=RTS_CONTROL_DISABLE; m_dcb.fOutxCtsFlow=false; m_dcb.fOutxCtsFlow=false; m_bPortReady = SetCommState(hComm, &m_dcb); if(m_bPortReady ==0){ printf("SetCommState Error","Error",MB_OK+MB_ICONERROR); CloseHandle(hComm); return false;} return true; } BOOL CSerialCom::SetCommunicationTimeouts(DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant) { if((m_bPortReady = GetCommTimeouts (hComm, &m_CommTimeouts))==0) return false; m_CommTimeouts.ReadIntervalTimeout =ReadIntervalTimeout; m_CommTimeouts.ReadTotalTimeoutConstant =ReadTotalTimeoutConstant; m_CommTimeouts.ReadTotalTimeoutMultiplier =ReadTotalTimeoutMultiplier; m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant; m_CommTimeouts.WriteTotalTimeoutMultiplier =WriteTotalTimeoutMultiplier; m_bPortReady = SetCommTimeouts (hComm, &m_CommTimeouts); if(m_bPortReady ==0){ printf("StCommTimeouts function failed","Com Port Error",MB_OK+MB_ICONERROR); CloseHandle(hComm); return false;} return true; } BOOL CSerialCom::WriteByte(BYTE bybyte) { iBytesWritten=0; if(WriteFile(hComm,&bybyte,1,&iBytesWritten,NULL)==0) return false; else return true; } BOOL CSerialCom::ReadByte(BYTE &resp) { BYTE rx; resp=0; DWORD dwBytesTransferred=0; if (ReadFile (hComm, &rx, 1, &dwBytesTransferred, 0)){ if (dwBytesTransferred == 1){ resp=rx; return true;}} return false; } void CSerialCom::ClosePort() { CloseHandle(hComm); return; }