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

📄 serialport.cpp

📁 用VC6++对串口编程的实现,主要对SMS的实现,可以模拟发短信,收短信,不过要相应的MODON
💻 CPP
字号:
// SerialPort.cpp: implementation of the CSerialPort class.
//
////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SerialPort.h"


CSerialPort::CSerialPort()
{
	m_hComm = NULL;
	m_hIOEvent = CreateEvent(NULL, false, false, NULL);
}

CSerialPort::~CSerialPort()
{
	CloseHandle(m_hIOEvent);
	ClosePort();
}


BOOL CSerialPort::OpenPort(TCHAR* strPortName)
/*
	指定异步IO方式打开串口
*/
{	
	m_hComm = CreateFile(strPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 
					FILE_FLAG_OVERLAPPED, 0);
	if(m_hComm == INVALID_HANDLE_VALUE)
	{
		MessageBox(NULL, _T("Cannot open Communication Port.Please\nQuit the program and Re-start your PC."), 
			_T("Com Port Error"), MB_OK | MB_ICONERROR);
		return false;
	}

	return true;	
}

BOOL CSerialPort::ConfigurePort(DWORD BaudRate, BYTE ByteSize, BOOL bParity, 
								BYTE ParityMode, BYTE StopBits, int in_buffer, int out_buffer)
{
	if(!::GetCommState(m_hComm, &m_dcb))
	{
		MessageBox(NULL, _T("GetCommState Error"), _T("Error"), MB_OK + MB_ICONERROR);
		ClosePort();
		return false;
	}

	m_dcb.BaudRate = BaudRate;
	m_dcb.ByteSize = ByteSize;
	m_dcb.Parity = ParityMode;
	m_dcb.StopBits = StopBits;
	m_dcb.fParity = bParity;
	//m_dcb.fBinary = 1;
	//m_dcb.XoffLim = 0;
	//m_dcb.XonLim = 0;
	//m_dcb.fDtrControl = DTR_CONTROL_ENABLE;	
	//m_dcb.fRtsControl = RTS_CONTROL_ENABLE;	
		
	if(!::SetCommState(m_hComm, &m_dcb))
	{
		MessageBox(NULL, _T("SetCommState Error"), _T("Error"), MB_OK|MB_ICONERROR);
		ClosePort();
		return false;
	}

	::SetupComm(m_hComm, in_buffer, out_buffer);

	return true;
}

BOOL CSerialPort::SetCommunicationTimeouts(DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, 
										   DWORD ReadTotalTimeoutConstant, 
										   DWORD WriteTotalTimeoutMultiplier, 
										   DWORD WriteTotalTimeoutConstant)
/*
	设置的Timeouts参数,默认值如下:

	//
	// 对于读操作,使用以下的值,可以在缓冲区有数据时立即返回,
	// 无数据时等待ReadTotalTimeoutConstant时间。
	// 
	DWORD ReadIntervalTimeout = 0xffffffff, 
	DWORD ReadTotalTimeoutMultiplier = 0xffffffff, 
	DWORD ReadTotalTimeoutConstant = 1000,	

	//
	// 考虑发送短信的情况每次发送的字节数有限,参考设备的波特率为
	// 9600, 设置以下超时参数.
	// 
	DWORD WriteTotalTimeoutMultiplier = 0, 
	DWORD WriteTotalTimeoutConstant = 1000		
*/
{
	if(!::GetCommTimeouts(m_hComm, &m_CommTimeouts))
		return false;
	
	m_CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout;
	m_CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant;
	m_CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier;
	m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant;
	m_CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier;

	if(!::SetCommTimeouts(m_hComm, &m_CommTimeouts))
	{
		MessageBox(NULL, _T("StCommTimeouts function failed"), _T("Com Port Error") , MB_OK + MB_ICONERROR);
		ClosePort();
		return false;
	}
	return true;
}

BOOL CSerialPort::SelectEvents(DWORD dwEvents)
{
	return ::SetCommMask(m_hComm, dwEvents);
}

int CSerialPort::WaitEvents(DWORD* pdwEvents, OVERLAPPED *pov)
{		
	if(::WaitCommEvent(m_hComm, pdwEvents, pov) == 0)
	{
		if(GetLastError() != ERROR_IO_PENDING)			
			return -1;
	}
	return 0;
}

void CSerialPort::ClosePort()
{
	if(m_hComm != NULL)
		CloseHandle(m_hComm);
	m_hComm = NULL;
}

/////////////////////////////////////////////////////////////////////////

int CSerialPort::WriteBytes(PBYTE pSent, int nLength)
{	
	DWORD		dwWriten;
	OVERLAPPED  ov = { 0 };
	
	ov.hEvent = m_hIOEvent;
	if(WriteFile(m_hComm, pSent, nLength, &dwWriten, &ov) == false)
	{
		if(GetLastError() != ERROR_IO_PENDING)
		{
			printf("write error: %d\n", GetLastError());
			return -1;
		}
		if(GetOverlappedResult(m_hComm, &ov, &dwWriten, true) == 0)
		{
			printf("GetOverlappedResult error: %d\n", GetLastError());
			return -1;
		}
	}

	return dwWriten;
}

int CSerialPort::ReadBytes(PBYTE pResp, int nLength)
{	
	DWORD		dwRead = 0;	
	int			read = 0;
	OVERLAPPED  ov = { 0 };

	ov.hEvent = m_hIOEvent;
	while(read < nLength)
	{
		if(ReadFile(m_hComm, pResp, nLength - read, &dwRead, &ov) == false)
		{
			if(GetLastError() != ERROR_IO_PENDING)
			{
				printf("read error: %d\n", GetLastError());
				return -1;
			}
			if(GetOverlappedResult(m_hComm, &ov, &dwRead, true) == 0)
			{
				printf("GetOverlappedResult error: %d\n", GetLastError());
				return -1;
			}
			if(dwRead == 0)
				return read;
		}
		read += dwRead;
	}
	pResp[nLength] = 0;

	return nLength;
}

int CSerialPort::ReadLine(PBYTE pLine, int nBufferLen)
{
	int read, ret;	

	read = 0;	
	ret = ReadBytes(pLine + read, 1);	
	while(read < nBufferLen && ret > 0)
	{			
		if(read >= 1 && pLine[read - 1] == '\r' && pLine[read] == '\n')
		{
			pLine[read + 1] = 0;
			return read + 1;
		}
		read++;
		ret = ReadBytes(pLine + read, 1);
	}
	return -1;
}

⌨️ 快捷键说明

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