|
#include "StdAfx.h"
#include "comport.h"
CComPort::CComPort(int num, DWORD baud)
: m_nTxCrc(0)
, m_nRxCrc(0)
{
CString port_name;
port_name.Format("COM%d:",num + 1);
m_hComm = CreateFile(
port_name,
GENERIC_READ | GENERIC_WRITE,
0,0,
OPEN_EXISTING,
0,0);
if (m_hComm == INVALID_HANDLE_VALUE)
{
return;
}
DCB dcb;
GetCommState(m_hComm,&dcb);
dcb.BaudRate = baud;
dcb.fParity = FALSE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fErrorChar = FALSE;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(m_hComm,&dcb);
SetupComm(m_hComm,10000,10000);
COMMTIMEOUTS ct;
ct.ReadIntervalTimeout = 10;
ct.ReadTotalTimeoutConstant = 10;
ct.ReadTotalTimeoutMultiplier = 10;
SetCommTimeouts(m_hComm,&ct);
}
CComPort::~CComPort(void)
{
if (!PortOk())
{
return;
}
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
void CComPort::Rts(bool set)
{
if (!PortOk()) return;
if (set) EscapeCommFunction(m_hComm,SETRTS);
else EscapeCommFunction(m_hComm,CLRRTS);
}
void CComPort::Dtr(bool set)
{
if (!PortOk()) return;
if (set) EscapeCommFunction(m_hComm,SETDTR);
else EscapeCommFunction(m_hComm,CLRDTR);
}
void CComPort::WriteByte(int byt)
{
if (!PortOk()) return;
ULONG written;
WriteFile(m_hComm,&byt,1,&written,NULL);
m_nTxCrc += byt;
// TRACE("Tx->%02Xh\n", byt);
}
int CComPort::ReadByte(void)
{
if (!PortOk()) return -1;
ULONG readed;
UCHAR byt;
ReadFile(m_hComm,&byt,1,&readed,NULL);
if (readed != 1)
{
// TRACE("timeout\n");
return -1;
}
// TRACE("Rx->%02Xh '%c'\n", byt, byt);
m_nRxCrc += byt;
return byt;
}
void CComPort::Flush(void)
{
if (!PortOk()) return;
PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);
}
int CComPort::ReadWord(void)
{
int ret = 0;
if (!ReadBuf((BYTE *)&ret, 2))
{
return -1;
}
return ret;
}
void CComPort::WriteWord(int w)
{
WriteBuf((BYTE *)&w, 2);
}
bool CComPort::ReadBuf(BYTE * data, int bytes)
{
int byt;
while (bytes --)
{
byt = ReadByte();
if (byt < 0)
{
return false;
}
*(data ++) = byt & 0xFF;
}
return true;
}
void CComPort::WriteBuf(BYTE * buf, int bytes)
{
while (bytes--)
{
WriteByte(*(buf ++));
// Sleep(1);
}
}
E-mail: info@telesys.ru