对串口通讯的封装(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++串口上位机协议包封装

上一篇说到串口协议的封包与拆包,主要要是应用于单片机与单片机通讯,或者与上位机程序通讯,这里我是与上位机程序通讯。 思路: 因为此功能是用c语言写的,所有在单片机上可以使用,在pc机上也是可以使用的。...
  • HES_C
  • HES_C
  • 2017年10月30日 14:02
  • 158

C/C++串口通信原理及读写与操作

转自王柏元的博客:C/C++串口通信原理及读写与操作 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各...
  • u014729825
  • u014729825
  • 2015年12月18日 22:26
  • 19784

简单封装的串口通信类

#include "stdafx.h" #include "SerialPort.h" #include "assert.h" CSerialPort::CSerialPort() {...
  • zww0815
  • zww0815
  • 2016年04月28日 16:11
  • 821

VC++USB及串口通信程序(附工程)

为公司开发产品测试程序,实际上是基于VC++的USB通信及串口通信。当初编写程序时,网上找了很多资料及程序,感觉大都只是说了一点点,没有一个完整的工程以供其他开发者借鉴,完全要靠开发者东拼西凑,最后凑...
  • phmatthaus
  • phmatthaus
  • 2016年04月12日 11:09
  • 5523

使用SerialPort类设计串口通讯程序

一.概述      在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通 过对此...
  • u012497865
  • u012497865
  • 2017年01月05日 09:23
  • 1160

用VC开发串口通信dll控件

VC串口通信技术网《VC串口上位机编程方法简介》介绍了串口编程的常见方法,其中就有使用串口dll控件的方法,dll是一种动态链接库,使用起来非常方便。    本文利用VC编程工具,对Windows提供...
  • shixin_0125
  • shixin_0125
  • 2015年03月02日 11:08
  • 1928

有关于串口通信程序的编写

Win 32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的声明为: HANDLE Create...
  • xuqiang918
  • xuqiang918
  • 2013年02月01日 09:05
  • 1514

Mac OS/Linux系统下实现串口通信

最近参加了一个机器人比赛,机器人部分装置需要靠Arduino板来控制,一共两块不同型号的Arduino板,这两块板需要进行通信,还需要分别和电脑上的c++程序通信。我的电脑是Mac Pro 2016款...
  • david8766
  • david8766
  • 2017年04月15日 16:32
  • 1229

C++builder串口通信设计(一)-串口接收数据

一、安装mscomm32.ocx控件 1、复制mscomm32.ocx到windows\system32\下 2、注册 二、在c++builder下引入mscomm32.ocx 选择菜单com...
  • niepangu
  • niepangu
  • 2016年01月11日 16:36
  • 1506

windows下,C++实现串口编程,串间口转发数据

在 Win32 下,可以使用两种编程方式实现串口通信,一是使用 ActiveX 控件。二是调用 Windows 的 API 函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文介绍 API ...
  • u013113231
  • u013113231
  • 2016年12月10日 12:33
  • 2402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对串口通讯的封装(C++)
举报原因:
原因补充:

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