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

📄 serial.cpp

📁 IEC60870-5-103规约测试工具。 目前只能打开COM1口
💻 CPP
字号:
// ComAPI.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Serial.h"

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

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

CSerial::CSerial()
{
	memset( &m_osRead, 0, sizeof( OVERLAPPED ) );
	memset( &m_osWrite, 0, sizeof( OVERLAPPED ) );
	m_osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
	m_osWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
}

CSerial::~CSerial()
{

}

HANDLE CSerial::OpenSerial( int comno, DCB _dcb )
{
	COMMTIMEOUTS	TimeOuts;
	char	InitComNo[32];
	DCB		dcb;
	HANDLE	m_hCom = INVALID_HANDLE_VALUE;
	sprintf( InitComNo, "\\\\.\\COM%d", comno );
	m_hCom = CreateFile(
		InitComNo,
		GENERIC_READ|GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
		NULL );
	if( m_hCom == INVALID_HANDLE_VALUE ) return INVALID_HANDLE_VALUE;
	SetupComm( m_hCom, 4096, 4096 );
	SetCommMask( m_hCom, EV_RXCHAR );
	TimeOuts.ReadIntervalTimeout = MAXDWORD; 
	TimeOuts.ReadTotalTimeoutMultiplier = 0; 
	TimeOuts.ReadTotalTimeoutConstant = 0; 
	TimeOuts.WriteTotalTimeoutMultiplier = 50;
	TimeOuts.WriteTotalTimeoutConstant = 2000;
	
	SetCommTimeouts( m_hCom, &TimeOuts );
	
	GetCommState( m_hCom, &dcb );
	dcb.BaudRate = _dcb.BaudRate;
	dcb.ByteSize = _dcb.ByteSize; 
	dcb.Parity = _dcb.Parity;
	dcb.StopBits = _dcb.StopBits ;
	dcb.fBinary = TRUE ;
	dcb.fParity = FALSE;
	if( !SetCommState( m_hCom, &dcb ) ) {
		CloseHandle( m_hCom );
		return INVALID_HANDLE_VALUE;
	}
	return m_hCom;
}

DWORD CSerial::ReadSerialData( HANDLE m_hCom, PVOID pData, DWORD dwLength, DWORD dwTimeOut /* = 20 */)
{
	DWORD length=0;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	
	Sleep( dwTimeOut );
	ClearCommError( m_hCom, &dwErrorFlags, &ComStat );
	length = min( dwLength, ComStat.cbInQue );
	ReadFile( m_hCom, pData, length, &length, &m_osRead );
	return length;
}

DWORD CSerial::WriteSerialData( HANDLE m_hCom, PVOID pData, DWORD dwLength )
{
	BOOL fState;
	DWORD length = dwLength;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	
	ClearCommError( m_hCom, &dwErrorFlags, &ComStat );
	fState = WriteFile( m_hCom, pData, length, &length, &m_osWrite );
	if( !fState ) {
		if( GetLastError() == ERROR_IO_PENDING ) {
			GetOverlappedResult( m_hCom, &m_osWrite, &length, TRUE );
		}
		else length = 0;
	}
	return length;
}

void CSerial::CloseSerial( HANDLE m_hCom )
{
	if( m_hCom != INVALID_HANDLE_VALUE ) CloseHandle( m_hCom );
}

⌨️ 快捷键说明

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