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

📄 com.cpp

📁 监视Modbus规约的通讯程序
💻 CPP
字号:
// Com.cpp: implementation of the CCom class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "dongmo.h"
#include "Com.h"

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

HANDLE m_hCom;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCom::CCom()
{
	m_hCom = INVALID_HANDLE_VALUE;
	m_csName[0] = 0;
}

CCom::~CCom()
{
	Close();
}

bool CCom::Open(LPCTSTR lpszFileName, DWORD dwBaudRate)
{
/*	m_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
	if(m_hCom==(HANDLE)-1)
	{AfxMessageBox("此串口已打开");
//	kai=0; 
	return 0;
	}
	else//配置串口参数
    {DCB dcb;
	GetCommState(m_hCom,&dcb);
	dcb.BaudRate=CBR_9600;//调试暂时改变
	dcb.fParity=0;//调试
	dcb.StopBits=ONESTOPBIT;
	dcb.ByteSize=8;
	dcb.Parity=NOPARITY;//调试	
    SetCommState(m_hCom,&dcb);
    COMMTIMEOUTS comm;//设置读写最长时间
    comm.ReadIntervalTimeout=MAXDWORD;
	comm.ReadTotalTimeoutConstant=0;
	comm.ReadTotalTimeoutMultiplier=0;
	comm.WriteTotalTimeoutConstant=1000;
	comm.WriteTotalTimeoutMultiplier=0;
	SetCommTimeouts(m_hCom,&comm);
	PurgeComm(m_hCom,PURGE_TXCLEAR);//清除缓冲区
    PurgeComm(m_hCom,PURGE_RXCLEAR);
	}*/

	if (strcmp(m_csName, lpszFileName))
	{
		HANDLE hTemp = CreateFile(lpszFileName, GENERIC_READ | GENERIC_WRITE,
			0, NULL, OPEN_EXISTING, 0, NULL);

	/*	if (hTemp == INVALID_HANDLE_VALUE)
			return false;*/

		Close();
		m_hCom = hTemp;
		strcpy(m_csName, lpszFileName);
	}

	DCB dcb;
	GetCommState(m_hCom, &dcb);
	dcb.BaudRate = dwBaudRate;
	dcb.ByteSize = 8;//8位字符码
	dcb.Parity = EVENPARITY;//偶校验,
	dcb.StopBits = ONESTOPBIT;//1位停止位,
	dcb.fDtrControl = DTR_CONTROL_ENABLE;
	dcb.fRtsControl = RTS_CONTROL_ENABLE;
	SetCommState(m_hCom, &dcb);

	COMMTIMEOUTS CommTimeOuts;
	CommTimeOuts.ReadIntervalTimeout =MAXDWORD;// 30000 / dwBaudRate + 3;
	CommTimeOuts.ReadTotalTimeoutMultiplier =0;// 10000 / dwBaudRate + 1;
	CommTimeOuts.ReadTotalTimeoutConstant = 0;
	CommTimeOuts.WriteTotalTimeoutMultiplier =0;// 5;
	CommTimeOuts.WriteTotalTimeoutConstant =1000;//0;
	SetCommTimeouts(m_hCom, &CommTimeOuts);

	SetupComm(m_hCom, 1024, 1024);
	
	PurgeComm(m_hCom, 
		PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
   
	return true;
}

void CCom::Close()
{
	if (m_hCom == INVALID_HANDLE_VALUE)
		return;

	CloseHandle(m_hCom);
	m_hCom = INVALID_HANDLE_VALUE;
	m_csName[0] = 0;
}

DWORD CCom::Read(LPVOID lpBuffer, DWORD dwNumberOfBytesToRead)
{
	memset(lpBuffer, 0, dwNumberOfBytesToRead);

	if (!IsOpen())
		return 0;

	DWORD dwErrors;
	COMSTAT Stat;
	ClearCommError(m_hCom, &dwErrors, &Stat);
	DWORD dwNumberOfBytesRead = 0;

	if (Stat.cbInQue > 0)
	{
		if (ReadFile(m_hCom, lpBuffer, dwNumberOfBytesToRead, &dwNumberOfBytesRead, NULL))//
		{/*CString Returndata;
	   Returndata.Format("%s",lpBuffer);
	   AfxMessageBox(Returndata);*/
	   return dwNumberOfBytesRead;	}
	}
    
	ClearCommError(m_hCom, &dwErrors, &Stat);
	return 0;
}

bool CCom::IsOpen()
{
	return (m_hCom != INVALID_HANDLE_VALUE);
}

bool CCom::SetRts(bool bRTS)
{
	return (EscapeCommFunction(m_hCom, (bRTS ? SETRTS : CLRRTS)) == TRUE);
}

bool CCom::Reopen(int Baudrate)
{
	return Open(m_csName, Baudrate);
}

DWORD CCom::Write( LPVOID lpBuffer, DWORD dwNumberOfBytesToWrite, bool bRTS)//LPVOID
{
	if (!IsOpen())
		return 0;

	if (bRTS)
		SetRts(true);

	PurgeComm(m_hCom, 
		 PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR);//
 
	DWORD dwNumberOfBytesWrite = 0;
	
	if (!WriteFile(m_hCom, lpBuffer, dwNumberOfBytesToWrite, &dwNumberOfBytesWrite, NULL))
	{
		DWORD dwErrors;
		COMSTAT Stat;
		ClearCommError(m_hCom, &dwErrors, &Stat);
		dwNumberOfBytesWrite = 0;
	}

	if (bRTS)
	{
		Sleep(10);
		SetRts(false);
	}
   
	return dwNumberOfBytesWrite;
}

DWORD CCom::Readdata()
{
	DWORD read;
	unsigned char readdata[20];
	 ReadFile(m_hCom,readdata,4,&read,NULL);//接收atz回码
	   CString Returndata;
	   Returndata.Format("%s",readdata);
	   AfxMessageBox(Returndata);
	   return read;
}

DWORD CCom::Writedata()
{
DWORD written;
	CString ModemOrder="abcd";
	PurgeComm(m_hCom,PURGE_RXCLEAR);
    WriteFile(m_hCom,ModemOrder,ModemOrder.GetLength(),&written,NULL);
    return written;
}

⌨️ 快捷键说明

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