// SerialPort.cpp: implementation of the CSerialPort class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "SerialPort.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CSerialPort::CSerialPort() { } CSerialPort::~CSerialPort() { } bool CSerialPort::Connect(TCHAR* portName, DWORD baudRate) { DCB dcb; COMMTIMEOUTS cto; BOOL success; m_hSerial=::CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(m_hSerial==INVALID_HANDLE_VALUE) { return false; } success=::GetCommState(m_hSerial, &dcb); if (success==FALSE) { ::CloseHandle(m_hSerial); return false; } dcb.DCBlength=sizeof(DCB); dcb.BaudRate=baudRate; dcb.fBinary=TRUE; dcb.fParity=FALSE; dcb.fOutxCtsFlow=TRUE; dcb.fOutxDsrFlow=FALSE; dcb.fDtrControl=DTR_CONTROL_DISABLE; dcb.fDsrSensitivity=FALSE; dcb.fTXContinueOnXoff=TRUE; dcb.fOutX=FALSE; dcb.fInX=FALSE; dcb.fErrorChar=FALSE; dcb.fNull=FALSE; dcb.fRtsControl=RTS_CONTROL_ENABLE; dcb.fAbortOnError=FALSE; dcb.XonLim=100; dcb.XoffLim=100; dcb.ByteSize=8; dcb.Parity=NOPARITY; dcb.StopBits=ONESTOPBIT; dcb.XonChar='?'; dcb.XoffChar='?'; dcb.ErrorChar='?'; dcb.EofChar='\0'; dcb.EvtChar='\0'; success=::SetCommState(m_hSerial, &dcb); if(success==FALSE) { ::CloseHandle(m_hSerial); return false; } cto.ReadIntervalTimeout=20; cto.ReadTotalTimeoutConstant=100; cto.ReadTotalTimeoutMultiplier=10; cto.WriteTotalTimeoutConstant=250; cto.WriteTotalTimeoutMultiplier=10; ::SetCommTimeouts(m_hSerial, &cto); if (success==TRUE) { return true; } else { return false; } } void CSerialPort::Disconnect() { ::CloseHandle(m_hSerial); } DWORD CSerialPort::GetBytes(unsigned char* buffer, unsigned int nBytes) { DWORD actuallyRead; ::ReadFile(m_hSerial, buffer, nBytes, &actuallyRead, NULL); return actuallyRead; } DWORD CSerialPort::PutBytes(const unsigned char* buffer, unsigned int nBytes) { DWORD actuallyWritten; ::WriteFile(m_hSerial, buffer, nBytes, &actuallyWritten, NULL); return actuallyWritten; } void CSerialPort::FlickRTS() { ::EscapeCommFunction(m_hSerial, CLRRTS); ::EscapeCommFunction(m_hSerial, SETRTS); }