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

📄 serialcomm.cpp

📁 free sources for gsm
💻 CPP
字号:
////////////////////////////////////////////////////////////////////////////
//		class CSerialComm
//
//		This class is used for serial link communication.
////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SerialComm.h"

CSerialComm::CSerialComm()
{
	m_bConnected = FALSE;
}
// 器飘 sPortName阑 dwBaud 加档肺 楷促.
// ThreadWatchComm 窃荐俊辑 器飘俊 公攫啊 佬躯阑 锭 MainWnd俊 舅府扁
// 困秦 WM_COMM_READ皋矫瘤甫 焊尘锭 鞍捞 焊尘 wPortID蔼阑 傈崔 罐绰促.
BOOL CSerialComm::OpenPort(WORD wPortID, DWORD dwBaud)
{
	// Local 函荐.
	COMMTIMEOUTS	timeouts;
	DCB				dcb;
	//DWORD			dwThreadID;
	//CString strTemp;

	// 函荐 檬扁拳
	m_bConnected = FALSE;
	m_wPortID = wPortID; // COM1-> 0, COM2->1,,,,,

	// overlapped structure 函荐 檬扁拳.
	m_osRead.Offset = 0;
	m_osRead.OffsetHigh = 0;
	if(!(m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))	
		return FALSE;

	m_osWrite.Offset = 0;
	m_osWrite.OffsetHigh = 0;
	if(!(m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
		return FALSE;
	
	// 器飘 凯扁
	m_sPortName.Format("\\\\.\\COM%d", wPortID);
	m_hComm = CreateFile(m_sPortName,
	                     GENERIC_READ | GENERIC_WRITE,
	                     0,
	                     NULL,
	                     OPEN_EXISTING,
	                     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
	                     NULL);
	if(m_hComm == (HANDLE) -1) return FALSE;

	// 器飘 惑怕 汲沥.

	// EV_RXCHAR event 汲沥
	SetCommMask(m_hComm, EV_RXCHAR | EV_TXEMPTY);	

	// InQueue, OutQueue 农扁 汲沥.
	//SetupComm(m_hComm, 4096, 4096);
	//SetupComm(m_hComm, 65536, 65536);
	SetupComm(m_hComm, 1024 * 8, 1024 * 8);
	
	// 器飘 厚快扁.
	PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);

	// timeout 汲沥.
	//timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
	timeouts.ReadIntervalTimeout = 0x00005000;
	timeouts.ReadTotalTimeoutMultiplier = 0;
	timeouts.ReadTotalTimeoutConstant = 0;
	timeouts.WriteTotalTimeoutMultiplier = 2*CBR_9600 / dwBaud;
	timeouts.WriteTotalTimeoutConstant = 0;
	SetCommTimeouts(m_hComm, &timeouts);

	//if (!SetDCB(9600)) return FALSE;
	// dcb 汲沥
	dcb.DCBlength = sizeof(DCB);
	GetCommState(m_hComm, &dcb);	// 抗傈 蔼阑 佬澜.
	dcb.BaudRate = dwBaud;
	dcb.ByteSize = DATABITS_8;
	dcb.Parity = 0;
	dcb.StopBits = ONESTOPBIT;

	//dcb.fDtrControl = DTR_CONTROL_ENABLE;
	//dcb.fRtsControl = RTS_CONTROL_ENABLE;

	dcb.fRtsControl = RTS_CONTROL_DISABLE;
	dcb.fDtrControl = DTR_CONTROL_DISABLE;

	//dcb.fInX = dcb.fOutX = FALSE;
	//dcb.XonChar = ASCII_XON;
	//dcb.XoffChar = ASCII_XOFF;
	//dcb.XonLim = 100;
	//dcb.XoffLim = 100;
	//dcb.fOutxCtsFlow = TRUE;
	//dcb.fOutxDsrFlow = TRUE;
	//dcb.fRtsControl = RTS_CONTROL_ENABLE; //RTS_CONTROL_HANDSHAKE;

	if(!SetCommState(m_hComm, &dcb))
	{
		AfxMessageBox("Fail!!");
		return FALSE;
	}

	EscapeCommFunction(m_hComm, CLRDTR);
	// 器飘 皑矫 静饭靛 积己.
	m_bConnected = TRUE;
	/*m_hThreadWatchComm = CreateThread( NULL, 0, 
		(LPTHREAD_START_ROUTINE)ThreadWatchComm, this, 0, &dwThreadID);
	if (! m_hThreadWatchComm)
	{
		ClosePort();
		return FALSE;
	}*/

	return TRUE;
}
	
// 器飘甫 摧绰促.
void CSerialComm::ClosePort()
{
	m_bConnected = FALSE;
	SetCommMask( m_hComm, 0);
	PurgeComm( m_hComm,					
		PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
	CloseHandle( m_hComm);
}

// 器飘俊 pBuff狼 郴侩阑 nToWrite父怒 敬促.
// 角力肺 静咯柳 Byte荐甫 府畔茄促.
DWORD CSerialComm::WriteComm(void *pBuff, DWORD nToWrite)
{
	DWORD	dwWritten, dwError, dwErrorFlags;
	COMSTAT	comstat;

	if (! WriteFile( m_hComm, pBuff, nToWrite, &dwWritten, &m_osWrite))
	{
		if (GetLastError() == ERROR_IO_PENDING)
		{
			// 佬阑 巩磊啊 巢酒 乐芭唱 傈价且 巩磊啊 巢酒 乐阑 版快 Overapped IO狼
			// 漂己俊 蝶扼 ERROR_IO_PENDING 俊矾 皋矫瘤啊 傈崔等促.
			// timeouts俊 沥秦霖 矫埃父怒 扁促妨霖促.

			while (! GetOverlappedResult( m_hComm, &m_osWrite, &dwWritten, TRUE))
			{
				Sleep(0);
				dwError = GetLastError();
				if (dwError != ERROR_IO_INCOMPLETE)
				{
					//TRACE("(%d)WRITE_Error : ERROR_IO_INCOMPLETE\n", m_wPortID);
					ClearCommError( m_hComm, &dwErrorFlags, &comstat);
					break;
				}
			}
		}
		else
		{
			dwWritten = 0;
			ClearCommError( m_hComm, &dwErrorFlags, &comstat);
		}
	}
	Sleep(0);
	return dwWritten;
}

// 器飘肺何磐 pBuff俊 nToWrite父怒 佬绰促.
// 角力肺 佬囚柳 Byte荐甫 府畔茄促.
DWORD CSerialComm::ReadComm(void *pBuff, DWORD nToRead)
{
	DWORD	dwRead, dwError, dwErrorFlags;
	COMSTAT	comstat;

	//----------------- system queue俊 档馒茄 byte荐父 固府 佬绰促.
	ClearCommError( m_hComm, &dwErrorFlags, &comstat);
	dwRead = comstat.cbInQue;
	
	if (dwRead > 0)
	{
		if (! ReadFile( m_hComm, pBuff, nToRead, &dwRead, &m_osRead))
		{

			if (GetLastError() == ERROR_IO_PENDING)
			{

				//--------- timeouts俊 沥秦霖 矫埃父怒 扁促妨霖促.
				while (! GetOverlappedResult( m_hComm, &m_osRead, &dwRead, TRUE))
				{
					Sleep(0);
					dwError = GetLastError();
					if (dwError != ERROR_IO_INCOMPLETE)
					{
						ClearCommError( m_hComm, &dwErrorFlags, &comstat);
						break;
					}
				}
			}

			else
			{
				dwRead = 0;
				ClearCommError( m_hComm, &dwErrorFlags, &comstat);
			}

		}
	}
	Sleep(0);
	return dwRead;
}


BOOL CSerialComm::SetDCB(DWORD nBaud, UINT nByteSize, 
						 UINT nParity, UINT nStop)
{
	DCB dcb;

	dcb.DCBlength = sizeof(DCB);
	GetCommState( m_hComm, &dcb);	// 抗傈 蔼阑 佬澜.
	dcb.BaudRate = nBaud;
	dcb.ByteSize = nByteSize;
	dcb.Parity = nParity;
	dcb.StopBits = nStop;

	// 器飘 厚快扁.
	PurgeComm( m_hComm,					
		PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);

	return SetCommState( m_hComm, &dcb);
}


BOOL CSerialComm::SetDTR(void)
{
	return ::EscapeCommFunction(m_hComm,SETDTR);
}

BOOL CSerialComm::ClearDTR(void)
{
	return ::EscapeCommFunction(m_hComm,CLRDTR);
}

DWORD CSerialComm::GetOutQLen()
{
	DWORD	dwErrorFlags;
	COMSTAT	comstat;

	//----------------- system queue俊 措扁等 农扁甫 犬牢.
	ClearCommError( m_hComm, &dwErrorFlags, &comstat);
	return comstat.cbOutQue ;

}

⌨️ 快捷键说明

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