264 lines
5.3 KiB
C++
264 lines
5.3 KiB
C++
//
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
// PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER
|
|
// REMAINS UNCHANGED.
|
|
//
|
|
// Email: yetiicb@hotmail.com
|
|
//
|
|
// Copyright (C) 2002-2003 Idael Cardoso.
|
|
//
|
|
|
|
//#include "Test.h"
|
|
#include "SerialPort.h"
|
|
#include "stdafx.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CSerialPort::CSerialPort()
|
|
: m_PortHandle(INVALID_HANDLE_VALUE)
|
|
{
|
|
|
|
}
|
|
|
|
CSerialPort::~CSerialPort()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
BOOL CSerialPort::Open(LPCTSTR PortName, uint32_t BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits, uint32_t DesiredAccess)
|
|
{
|
|
Close();
|
|
m_PortHandle = CreateFile(PortName, DesiredAccess, 0, NULL, OPEN_EXISTING, 0, 0);
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
DCB dcb;
|
|
CString s;
|
|
dcb.DCBlength = sizeof(dcb);
|
|
GetCommState(m_PortHandle, &dcb);
|
|
//printf("dcb: BaudRate before=%d\n", dcb.BaudRate);
|
|
//printf("dcb: ByteSize before=%d\n", dcb.ByteSize);
|
|
//printf("dcb: StopBits before=%d\n", dcb.StopBits);
|
|
//printf("dcb: Parity before=%d\n", dcb.Parity);
|
|
dcb.BaudRate = BaudRate;
|
|
dcb.ByteSize = ByteSize;
|
|
dcb.StopBits = StopBits;
|
|
dcb.Parity = Parity;
|
|
//printf("dcb: fDsrSensitivity before=%d\n", dcb.fDsrSensitivity);
|
|
//printf("dcb: fOutxCtsFlow before=%d\n", dcb.fOutxCtsFlow);
|
|
//printf("dcb: fOutxDsrFlow before=%d\n", dcb.fOutxDsrFlow);
|
|
//printf("dcb: fInX before=%d\n", dcb.fInX);
|
|
//printf("dcb: fOutX before=%d\n", dcb.fOutX);
|
|
//printf("dcb: fDtrControl before=%d\n", dcb.fDtrControl);
|
|
//printf("dcb: fRtsControl before=%d\n", dcb.fRtsControl);
|
|
dcb.fDsrSensitivity = 0;
|
|
dcb.fOutxCtsFlow = 0;
|
|
dcb.fOutxDsrFlow = 0;
|
|
dcb.fInX = 0;
|
|
dcb.fOutX = 0;
|
|
dcb.fDtrControl = DTR_CONTROL_DISABLE; //DTR and RTS 0
|
|
dcb.fRtsControl = RTS_CONTROL_DISABLE;
|
|
|
|
SetCommState(m_PortHandle, &dcb);
|
|
|
|
COMMTIMEOUTS touts;
|
|
touts.ReadIntervalTimeout = UINT32_MAX; // This, plus the zero timeouts causes immediate return
|
|
touts.ReadTotalTimeoutMultiplier = 0;
|
|
touts.ReadTotalTimeoutConstant = 0;
|
|
touts.WriteTotalTimeoutConstant = 1;
|
|
touts.WriteTotalTimeoutMultiplier = 0;
|
|
SetCommTimeouts(m_PortHandle, &touts);
|
|
|
|
//SetCommMask (m_PortHandle, EV_CTS | EV_DSR | EV_RING | EV_RLSD);
|
|
PurgeComm(m_PortHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
printf("Open COM Error: %i\n", GetLastError());
|
|
return FALSE; // Use GetLastError() to know the reason
|
|
}
|
|
}
|
|
|
|
void CSerialPort::Close()
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
CloseHandle(m_PortHandle);
|
|
m_PortHandle = INVALID_HANDLE_VALUE;
|
|
}
|
|
}
|
|
|
|
BOOL CSerialPort::IsOpen()
|
|
{
|
|
return (m_PortHandle != INVALID_HANDLE_VALUE);
|
|
}
|
|
|
|
uint32_t CSerialPort::Read(LPVOID Buffer, uint32_t BufferSize)
|
|
{
|
|
DWORD Res(0);
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
ReadFile(m_PortHandle, Buffer, BufferSize, &Res, NULL);
|
|
}
|
|
return Res;
|
|
}
|
|
|
|
uint32_t CSerialPort::Write(const LPVOID Buffer, uint32_t BufferSize)
|
|
{
|
|
DWORD Res(0);
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
(void)WriteFile(m_PortHandle, Buffer, BufferSize, &Res, NULL);
|
|
}
|
|
return Res;
|
|
}
|
|
|
|
BOOL CSerialPort::Get_CD_State()
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD ModemStat;
|
|
if (GetCommModemStatus(m_PortHandle, &ModemStat))
|
|
{
|
|
return (ModemStat & MS_RLSD_ON) > 0; //Not sure
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL CSerialPort::Get_CTS_State()
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD ModemStat;
|
|
if (GetCommModemStatus(m_PortHandle, &ModemStat))
|
|
{
|
|
return (ModemStat & MS_CTS_ON) > 0;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL CSerialPort::Get_DSR_State()
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD ModemStat;
|
|
if (GetCommModemStatus(m_PortHandle, &ModemStat))
|
|
{
|
|
return (ModemStat & MS_DSR_ON) > 0;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL CSerialPort::Get_RI_State()
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD ModemStat;
|
|
if (GetCommModemStatus(m_PortHandle, &ModemStat))
|
|
{
|
|
return (ModemStat & MS_RING_ON) > 0;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void CSerialPort::Set_DTR_State(BOOL state)
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
EscapeCommFunction(m_PortHandle, (state ? SETDTR : CLRDTR));
|
|
}
|
|
}
|
|
|
|
BOOL CSerialPort::Get_DTR_State()
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD ModemStat;
|
|
if (GetCommModemStatus(m_PortHandle, &ModemStat))
|
|
{
|
|
return (ModemStat & MS_DSR_ON) > 0; //Not sure
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void CSerialPort::Set_RTS_State(BOOL state)
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
if (0 == EscapeCommFunction(m_PortHandle, (state ? SETRTS : CLRRTS))) {
|
|
printf("Set_RTS_State(%d) failed.\n", state ? 1 : 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL CSerialPort::Get_RTS_State()
|
|
{
|
|
if (m_PortHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD ModemStat;
|
|
if (GetCommModemStatus(m_PortHandle, &ModemStat))
|
|
{
|
|
return (ModemStat & MS_CTS_ON) > 0; //Not sure
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|