Вот примерчик:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Сидоргек 27 февраля 2004 г. 12:29
В ответ на: Есть у народа опыт по работе с COM-портами (Visual C++) под WinXP? отправлено krb 27 февраля 2004 г. 12:21

#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