⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pubsub.cpp

📁 这是一个串口通讯的例子
💻 CPP
字号:
// PubSub.cpp: implementation of the CPubSub class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SerialCom.h"
#include "PubSub.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPubSub::CPubSub()
{
	m_hCom = INVALID_HANDLE_VALUE;
}

CPubSub::~CPubSub()
{

}

//===========================================================
// 功能:打开资源
// 参数:ComNo:串口号,Baut:波特率,Data:数据位,Stop:停止位
//       Parity:校验位,cbInBuf:输入队列大小,cbOutBuf:输出队列大小
//===========================================================
BOOL CPubSub::OpenCom(int ComNo,DWORD Baut,int Data,int Stop,int Parity,DWORD cbInBuf,DWORD cbOutBuf)
{
	if(INVALID_HANDLE_VALUE!=m_hCom)
		CloseCom();

	DCB Dcb;
	COMMTIMEOUTS TimeOut;
	char p[30];
	if(ComNo<1||ComNo>255) return FALSE;

	if(INVALID_HANDLE_VALUE!=m_hCom)
		CloseHandle(m_hCom);

	Baut=(Baut<50)? 50:Baut;
	Data=((Data>=4)&&(Data<=8))?(BYTE)Data:8;
	Stop=Stop>3 ? (BYTE)1:Stop;
	Parity=Parity>3 ? (BYTE)1:Parity;

	sprintf(p,"COM%d",ComNo);

	m_hCom=CreateFile(p,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
	if(m_hCom==INVALID_HANDLE_VALUE) return FALSE;

	GetCommState(m_hCom,&Dcb);
	Dcb.BaudRate=Baut;
	Dcb.ByteSize=Data;
	Dcb.StopBits=Stop;
	Dcb.Parity=Parity;
	if(!SetCommState(m_hCom,&Dcb))
	{
		CloseHandle(m_hCom);
		m_hCom=INVALID_HANDLE_VALUE;
		return FALSE;
	}
	memset(&TimeOut, 0, sizeof(TimeOut));
	TimeOut.ReadIntervalTimeout = MAXDWORD;
	SetCommTimeouts(m_hCom, &TimeOut);//表示立即返回

	SetupComm(m_hCom,cbInBuf,cbOutBuf);

	return TRUE;

}

//================================================
// 功能:获取串行口缓冲区的字节数
//================================================
int CPubSub::GetDataLen()
{
	if(m_hCom==INVALID_HANDLE_VALUE)
		return 0;

	COMSTAT comstat;
	DWORD dwError;
	if(ClearCommError(m_hCom,&dwError,&comstat))
		return comstat.cbInQue;
	dwError=GetLastError();
	return 0;
}

//===================================================
// 功能:读串行口
//===================================================
DWORD CPubSub::ReadCom(BYTE *pBuff,int nCount)
{
	if(m_hCom==INVALID_HANDLE_VALUE)
		return 0;
	DWORD read=0;
	ReadFile(m_hCom , pBuff , nCount , &read , NULL);
	return read;
}

//==================================================
// 功能:写串行口
// 参数:pBuff:数据缓冲区,nCount:要写入数据的字节数
//==================================================
BOOL CPubSub::WriteCom(BYTE *pBuff, int nCount)
{
	if(m_hCom==INVALID_HANDLE_VALUE)
		return FALSE;
	DWORD written=0;
	BOOL ret=WriteFile(m_hCom,pBuff,nCount,&written,NULL);
	return ret;
}

//==============================================
// 功能:关闭串行口
//==============================================
BOOL CPubSub::CloseCom()
{
	if(m_hCom!=INVALID_HANDLE_VALUE)
	{
		if(CloseHandle(m_hCom))
			m_hCom=INVALID_HANDLE_VALUE;
	}
	return (m_hCom==INVALID_HANDLE_VALUE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -