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

原创 2007年09月14日 11:39:00

基于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 );
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++ builder 多进程串口通讯程序1 (项目分析)

总体实现过程:1.数据接收块  2.接收数据处理块  3.数据发送块,4.进程通讯块              其中还有数据加密,电台译码,硬件操作指令选择等等 1. 数据...

C++ 串口通讯

  • 2011-09-16 19:39
  • 13.50MB
  • 下载

vc 串口通讯类封装

上章封装了usb hid通讯类,本章讲来封装串口通讯类,采用的是同步机制。本工程是基于vs2010 mfc写的,工程名CommExample. 新建CommClass.h头文件,里面代码: #pr...

Rfid通信1-串口模式(附:对串口通讯进行了封装源码及学习资料)

最近在接触串口这块,有些感悟想和大家交流交流,希望大家多多提点意见,共同进步。 先从代码说起,主要是参 博客园里寒江独钓客的一篇名为SerialPort.DataReceived之“管收不管埋”的文章...

C++串口通讯源程序

  • 2015-10-27 18:06
  • 67KB
  • 下载

Wince 串口通讯助手

界面设计(为鸟达到窗口翻页效果,我把标题栏去掉鸟)HANDLE m_hComm;     //串口读写处理CEdit * g_receive; //接收数据 文本框指针(主要用在线程里面)CEdit ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)