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

📄 serial.cpp

📁 gprs开发使用程序
💻 CPP
字号:
/*!	\file		CSerial.cpp
	\brief		CSerial类实现文件
	\author		陈华毅
	\version	1.0

	这个类完成处理串口操作。通过 \a OpenComm()读取打开串口;
			通过\a CloseComm()从关闭串口。
	\defgroup	CSERIAL_IMPLEMENT	CSerial类实现说明
*/

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

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

//@{Group: CSERIAL_IMPLEMENT

CSerial::CSerial()
{

}

CSerial::~CSerial()
{

}


DWORD CSerial::InitDCB()
{
	DCB dcb;

	dcb.fBinary = TRUE;		/* Win32不支持非二进制串行传输模式,必须为TRUE */
	dcb.fParity = FALSE;	/* 不启用奇偶校验 */
	dcb.BaudRate = 115200;
	dcb.ByteSize = 8;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;

	/* 控制位 */
	dcb.fRtsControl = RTS_CONTROL_DISABLE;
	dcb.fOutxCtsFlow = FALSE;
	dcb.fOutX = FALSE;		/* 设为TRUE指定XON/XOFF控制被用于控制串行输出 */
	dcb.fInX = FALSE;		/* 设为TRUE指定XON/XOFF控制被用于控制串行输入 */

	/* XON/XOFF流控制设置 */
	dcb.fInX=dcb.fOutX = FALSE;
	dcb.XonChar = 0x11;
	dcb.XoffChar = 0x13;
	dcb.XonLim = 500;
	dcb.XoffLim = 500;

	return SetCommState(m_hFile,&dcb);
}

DWORD CSerial::ReadComm(BYTE *pData, DWORD dwLength)
{
	DWORD length=0;
	DWORD dwRealRead=0;
	COMSTAT ComStat;
	DWORD dwErrorFlags;

	BOOL Status;

	/* 检测串口缓存内数据 */
	ClearCommError(m_hFile,&dwErrorFlags,&ComStat);
	length = min(dwLength, ComStat.cbInQue);

	Status = ReadFile(m_hFile, pData, length, &dwRealRead, NULL);
	if(Status == FALSE)
	{
		DWORD error;
		MessageBox(NULL,TEXT("Read file failed"),NULL, MB_OK);
		error = GetLastError();
		/* 超时退出 */
		if(error == ERROR_TIMEOUT)
		{
			return dwRealRead;
		}
		
	}
	return dwRealRead;
}

BOOL CSerial::CloseComm()
{
	if (m_hFile)
	{
		/* 结束线程中WaitCommEvent的等待 */
		SetCommMask(m_hFile, 0);

		/* 清除端口上指定信号的状态 */
		EscapeCommFunction(m_hFile, CLRDTR);
		EscapeCommFunction(m_hFile, CLRRTS);

		/* 清除驱动程序内部的发送和接收队列 */
		PurgeComm(m_hFile, PURGE_TXCLEAR | PURGE_RXCLEAR);
		CloseHandle(m_hFile);
		m_hFile = INVALID_HANDLE_VALUE;
		return TRUE;
	} else{
		::MessageBox(NULL, TEXT("Close Comm Failed!"), NULL, MB_OK);
		return FALSE;
	}
}


BOOL CSerial::OpenComm()
{
	COMMTIMEOUTS TimeOuts;
	CString str ;
	m_hFile = CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if (INVALID_HANDLE_VALUE == m_hFile)
	{
		MessageBox(NULL, TEXT("OpenComm failed"), NULL, MB_OK);
		str.Format(TEXT("%d"),GetLastError());
		MessageBox(NULL, str, NULL, MB_OK) ;
	}

	/* 设置串口接收和发送缓冲大小 */
	if (!SetupComm(m_hFile, 1024, 1024)) 
	{
		MessageBox(NULL,TEXT("SetupComm failed\r\n"), NULL, MB_OK);
		return FALSE;
	}

    /* 设置事件和超时时间 */
    if(!SetCommMask(m_hFile, EV_RXCHAR)) 
	{
		MessageBox(NULL, TEXT("SetupCommMask failed\r\n"), NULL, MB_OK);
		return FALSE;
	}
	TimeOuts.ReadIntervalTimeout = MAXDWORD;
	TimeOuts.ReadTotalTimeoutMultiplier = 0;
	TimeOuts.ReadTotalTimeoutConstant = 0;
	TimeOuts.WriteTotalTimeoutMultiplier = 100;
	TimeOuts.WriteTotalTimeoutConstant = 1000;

	SetCommTimeouts(m_hFile,&TimeOuts);
	if (!InitDCB())
	{
		MessageBox(NULL, TEXT("config comm failed"), NULL, MB_OK);
	}
	return TRUE;
}


DWORD CSerial::WriteComm(BYTE *pData, DWORD dwLength)
{
	BOOL fState;
	DWORD length = dwLength;
	DWORD dwRealWrite;
	DWORD dwErrorFlags;

	ClearCommError(m_hFile, &dwErrorFlags, NULL);
	fState = WriteFile(m_hFile, pData, length, &dwRealWrite, NULL);

	if(FALSE == fState)
	{
		MessageBox(NULL, TEXT("Write comm failed"), NULL, MB_OK);
		dwRealWrite = 0;
	}
	return dwRealWrite;

}

⌨️ 快捷键说明

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