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

📄 scom.cpp

📁 MDF监控源码2
💻 CPP
字号:
// SCom.cpp: implementation of the CSCom class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MDF.h"
#include "SCom.h"
#include "MDFDlg.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CMDFApp theApp ;

//##ModelId=44B6F8840014
CSerialComm::CSerialComm()
{
	m_bOpen = FALSE ;
	m_bGsm = FALSE ;
	m_strPort = "COM1" ;
	hWrite = CreateEvent ( NULL , FALSE , TRUE , NULL ) ;	//建立信号状态
	m_hEvent = CreateEvent ( NULL, FALSE , TRUE , NULL ) ;	//建立信号状态
}

//##ModelId=44B6F8840015
CSerialComm::~CSerialComm()
{
	CloseHandle(hWrite) ;
	CloseHandle(m_hEvent) ;
	CloseHandle(m_hCom) ;
}

//##ModelId=44B6F8840011
UINT CSerialComm::SCThd(LPVOID pPara)
{

	UCHAR buf[4096] ;
	int nRLen ;
	CString ss,strTip ;
	memset(buf,0,sizeof(buf)) ;

	COMSTAT ComStat;
	DWORD dwLength ;
	DWORD dwErrorFlags;

	CSerialComm* pSCom ;
		//数据库嵌入对象初始化

	if( pPara == NULL )
		return -1;

	pSCom = (CSerialComm*)pPara ;

	while( pSCom->m_bOpen )
	{
		ClearCommError(pSCom->m_hCom , &dwErrorFlags , &ComStat);
		
		if( ComStat.cbInQue > 0 )
		{
			Sleep(pSCom->m_ulTime) ;//GSM需等待200ms以保证通讯正确

			ClearCommError(pSCom->m_hCom , &dwErrorFlags , &ComStat);

			dwLength = ComStat.cbInQue ;

			if( dwLength  )
			{
				nRLen = ReadFile(pSCom->m_hCom , buf , dwLength , &dwLength , NULL ) ;

				if( dwLength > 0 ) 
				{
					buf[dwLength] = '\0' ;
					pSCom->DataProcess(buf,dwLength) ; //对接受数据进行处理
					memset(buf,0,sizeof(buf)) ;
				}

			}
		}
		Sleep(1) ;//提高程序的效率
	}

	pSCom->m_pReadThread = NULL ;

	strTip.Format("系统:通讯串口 %s 关闭",pSCom->GetPort()) ; //设置通讯串口
	theApp.Show(strTip) ;

	return 0 ;
}

//##ModelId=44B6F8840010
void CSerialComm::Connfig()
{
	DCB dcb;

	COMMTIMEOUTS TimeOuts = {					// 串口超时控制参数
		100,									// 读字符间隔超时时间: 100 ms
		1,										// 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
		500,									// 基本的(额外的)读超时时间: 500 ms
		1,										// 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
		100};									// 基本的(额外的)写超时时间: 100 ms

	SetupComm(m_hCom,4096,4096);

	SetCommTimeouts(m_hCom, &TimeOuts);

	GetCommState(m_hCom, &dcb) ;

	dcb.fBinary = TRUE ;						//传输二进制
	dcb.BaudRate = m_ulRate ;					//数据传输速率
	dcb.ByteSize = 8 ;							// 每字节位数
	dcb.fParity = TRUE ;						//校验
	dcb.Parity = NOPARITY ;						//为无校验
	dcb.StopBits = ONESTOPBIT ;					//1停止位

	SetCommState(m_hCom, &dcb);

}

//##ModelId=44B6F8840007
BOOL CSerialComm::OpenCom(CString strPort)
{
	CString strTip ;

	iRecvLen = 0 ;
	memset( ucRecvBuf , 0 , sizeof(ucRecvBuf)) ;

	m_pReadThread = NULL ;
	m_ulRate = 9600 ;
	m_ulTime = 0 ;
	m_bThread = TRUE ;//设读取线程为真
	m_bOpen = FALSE ;//端口未打开

	m_strPort = strPort ; //端口赋值

	if(m_strPort.IsEmpty())
		return m_bOpen = FALSE ;

	m_hCom = CreateFile( 
			strPort,						// 串口名称或设备路径
			GENERIC_READ | GENERIC_WRITE,	// 读写方式
			0,								// 共享方式:独占
			NULL,							// 默认的安全描述符
			OPEN_EXISTING,					// 创建方式
			0,								// 不需设置文件属性
			NULL							// 不需参照模板文件
			);								

	if( m_hCom == INVALID_HANDLE_VALUE )
	{
		strTip.Format("异常:通讯串口 %s 开启失败",strPort) ;
		theApp.Show(strTip) ;
		theApp.OutPut(strTip) ;
		strTip = "* " + strTip ;
		return m_bOpen = FALSE ;
	}

	Connfig() ;		//设置串口参数

	strTip.Format("系统:通讯串口 %s 开启",strPort) ;
	theApp.Show(strTip) ;
	theApp.OutPut(strTip) ;
	strTip = "* " + strTip ;
	theApp.DebugShow(strTip) ;

	return m_bOpen = TRUE ;

}

//##ModelId=44B6F8840005
void CSerialComm::CloseCom()
{
	CString strTip ;

	m_bOpen = FALSE ;
	m_bThread = FALSE ;

	CloseHandle(m_hCom) ;

}

//##ModelId=44B6F88303DF
void CSerialComm::DataProcess(UCHAR *buf, DWORD len)
{
	theApp.m_pComm->RecvData(buf,len,ucRecvBuf,&iRecvLen,m_strPort) ;
}

//##ModelId=44B6F88303D8
int CSerialComm::Write(CString strBUF)
{
	//int iRet ;
	CString strTip ;

	DWORD dwLength = strBUF.GetLength() ;

	//iRet = WaitForSingleObject( hWrite , 1500 ) ;

	//if ( iRet != WAIT_OBJECT_0 )
	//{
		//SetEvent(hWrite) ;
		//return -1 ;
	//}

	if( m_bOpen )
		WriteFile(m_hCom,strBUF.GetBuffer(0),dwLength,&dwLength,NULL);
	else
		dwLength = 0 ;

	//Sleep(300) ;
	//SetEvent(hWrite) ;

	return (int)dwLength ;
}

//##ModelId=44B6F88303AD
int CSerialComm::Write(char *buf, int len)
{
	int iRet ;
	CString strTip,strSend ;
	
	DWORD dwLength = len ;

	strSend = buf ;

	iRet = WaitForSingleObject( hWrite , 1500 ) ;

	if ( iRet != WAIT_OBJECT_0 )
	{
		SetEvent(hWrite) ;
		return -1 ;
	}

	if( m_bOpen )
		WriteFile(m_hCom,buf,dwLength,&dwLength,NULL);

	Sleep(300) ;
	SetEvent(hWrite) ;

	return (int)dwLength ;

}

//##ModelId=44B6F8840002
BOOL CSerialComm::InitCom(CString strPort)
{

	if(	OpenCom(strPort) )
	{
		m_pReadThread=::AfxBeginThread(SCThd, this);	//启动读串口线程
		return TRUE ;
	}
	else
		return FALSE ;

}

//##ModelId=44B6F88303DB
int CSerialComm::Read(CString &strRead , int nLength)
{
	DWORD dwNumRead;	// 串口收到的数据长度
	UCHAR buf[4096] ;

	ReadFile(m_hCom, buf, (DWORD)nLength, &dwNumRead, NULL);

	buf[dwNumRead] = '\0' ; 

	strRead = buf ;
	
	return (int)dwNumRead;
}

//##ModelId=44B6F88303AA
int CSerialComm::Read(char *buf, int len)
{
	DWORD dwNumRead;	// 串口收到的数据长度

	ReadFile(m_hCom, buf, (DWORD)len, &dwNumRead, NULL);

	*(buf+dwNumRead) = '\0' ; 
	
	return (int)dwNumRead;
}

//##ModelId=44B6F88303A9
CString CSerialComm::GetPort()
{
	return m_strPort ;
}

⌨️ 快捷键说明

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