关闭

对串口通讯的封装(C++)

标签: 通讯c++nullmfcclass
441人阅读 评论(0) 收藏 举报

基于MFC的对串口通讯的封装

// SerialPort.h

 class CSerialPort
{
private:
 HANDLE m_hnd;
 void Init( int );

public:
 cSerialPort() : m_hnd(INVALID_HANDLE_VALUE) {}
 ~cSerialPort() { Close(); }
 BOOL Open( int, int=-1 );
 BOOL IsOpen() { return m_hnd!=INVALID_HANDLE_VALUE; }
 void Close();
 BOOL Send( char*, int );
 BOOL Receive( char*, int& );
};

// SerialPort.cpp

#include "stdafx.h"

BOOL CSerialPort::Open( int port, int baud )
{
 if( port < 0 || port > 8 )
  return FALSE;
 char buf[8];
 sprintf( buf, "COM%i", port );
 m_hnd=::CreateFile( buf, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
 if( m_hnd!=INVALID_HANDLE_VALUE )
  Init( baud );
 return m_hnd!=INVALID_HANDLE_VALUE;
}

void CSerialPort::Close()
{
 if( m_hnd!=INVALID_HANDLE_VALUE )
  ::CloseHandle(m_hnd); 
 m_hnd=INVALID_HANDLE_VALUE;
}

BOOL CSerialPort::Send( char *buf, int buf_len )
{
 unsigned long bytes=0;
 BOOL res=::WriteFile( m_hnd, buf, buf_len, &bytes, NULL );
 return res && buf_len==(int)bytes;
}

BOOL CSerialPort::Receive( char *buf, int& buf_len )
{
 unsigned long bytes=0;
 ::ReadFile( m_hnd, buf, buf_len, &bytes, NULL );
 BOOL res=buf_len==(int)bytes;
 buf_len=(int)bytes;
 return res;
}

void CSerialPort::Init( int baud )
{
 // defaults
 if( baud <= 0 ) baud=19200;
 DCB dcb={sizeof(DCB)};
 ::GetCommState( m_hnd, &dcb );
 dcb.DCBlength = sizeof(dcb);
 dcb.fBinary  = 1;
 dcb.fDtrControl = DTR_CONTROL_DISABLE;
 dcb.fRtsControl = RTS_CONTROL_DISABLE;
 dcb.BaudRate = baud;
 dcb.Parity  = NOPARITY; 
 dcb.StopBits = ONESTOPBIT;
 dcb.ByteSize = 8;
 dcb.XonChar  = 0;//ASCII_XON;
 dcb.XoffChar = 0;//ASCII_XOFF;
 dcb.XonLim  = 0;//100;
 dcb.XoffLim  = 0;//100;
 dcb.fOutX  = FALSE;// TRUE;  // XON/XOFF out flow control
 dcb.fInX  = FALSE;// TRUE;  // XON/XOFF in flow control
 ::SetCommState( m_hnd, &dcb );

 // timeouts - 3 sec
 COMMTIMEOUTS timeouts;
 timeouts.ReadIntervalTimeout=0;
 timeouts.ReadTotalTimeoutMultiplier=0;
 timeouts.ReadTotalTimeoutConstant=3000;
 timeouts.WriteTotalTimeoutMultiplier=0;
 timeouts.WriteTotalTimeoutConstant=3000;
 ::SetCommTimeouts( m_hnd, &timeouts );
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26250次
    • 积分:420
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类