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

📄 serial.cpp

📁 该示例代码演示了WinCE下
💻 CPP
字号:
//济南海硕科技有限公司目前拥有一套具有自主知识产权的,既可以面向终端用户,也可以面向二次开发用户的嵌入式应用平台。

//对于终端用户,海硕公司可以根据用户的需求,为其量身定做WinCE下的应用软件。

//对于二次开发用户,海硕公司可以提供最大程度上的技术支持。

//另外海硕公司还对外承接项目工程。

//联系电话:15106930064       15866616892

//传    真:(0531)86300038

//网     址:www.handshow.net

//技术论坛:www.handshow.net/bbs




#include "StdAfx.h"
#include "serial.h"

// CSerial
CSerial::CSerial():
m_hCom(INVALID_HANDLE_VALUE)
{
	OpenCom();
}

CSerial::~CSerial()
{
	CloseCom();
}


// CSerial 成员函数
//串口操作区
//====================================================================================

//打开串口
BOOL CSerial::OpenCom()
{
	m_hCom = CreateFile(_T("COM2:") , GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , 0 , NULL);
	if(INVALID_HANDLE_VALUE == m_hCom)
	{
		CString strError;
		strError.Format(_T("打开串口错误,错误编号为:%d"),GetLastError());
		MessageBox(0 , strError , _T("错误") , MB_OK | MB_ICONERROR);
		return FALSE;
	}
	
	//如果初始化串口失败,返回FALSE。
	if(!InitCom())
	{
		return FALSE;
	}

	return TRUE;
}

//关闭串口
void CSerial::CloseCom()
{
	EscapeCommFunction(m_hCom , CLRDTR);
	EscapeCommFunction(m_hCom , CLRRTS);

	PurgeComm(m_hCom , PURGE_TXCLEAR | PURGE_RXCLEAR);
	if(INVALID_HANDLE_VALUE != m_hCom)
	{
		CloseHandle(m_hCom);

		m_hCom = INVALID_HANDLE_VALUE;
	}
}

//初始化串口
BOOL CSerial::InitCom()
{
	//设置端口监测事件
	//SetCommMask(m_hCom , EV_RXCHAR);

	//分配端口缓冲区
	SetupComm(m_hCom , (COMBUFSIZE<<1) , (COMBUFSIZE<<1));

	//初始化缓冲区中的信息
	PurgeComm(m_hCom , PURGE_RXCLEAR);

	//设定DCB
	DCB	ComDCB;

	ComDCB.DCBlength = sizeof(DCB);
	GetCommState(m_hCom , &ComDCB);
	ComDCB.Parity	 = NOPARITY;
	ComDCB.BaudRate	 = 9600;
	ComDCB.ByteSize  = 8;
	ComDCB.StopBits  = ONESTOPBIT; 

	if(!SetCommState(m_hCom , &ComDCB))
	{
		CString strError;
		strError.Format(_T("设置DCB失败,错误编号为:%d"),GetLastError());
		MessageBox(0 , strError , _T("错误") , MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//设定DCB结束

	//设定设备超时
	COMMTIMEOUTS	ComTimeOuts;

	GetCommTimeouts(m_hCom , &ComTimeOuts);
	//当设置ReadIntervalTimeout为MAXDWORD
	ComTimeOuts.ReadIntervalTimeout		    = MAXDWORD;	
	//设置ReadTotalTimeoutConstant为0
	ComTimeOuts.ReadTotalTimeoutConstant    = 100;
	//设置ReadTotalTimeoutMultiplier为0时,表示读取操作将立即返回存放在输入缓冲区的字符。
	ComTimeOuts.ReadTotalTimeoutMultiplier  = 1;				
	ComTimeOuts.WriteTotalTimeoutConstant   = 10;
	ComTimeOuts.WriteTotalTimeoutMultiplier = 10;

	if(!SetCommTimeouts(m_hCom , &ComTimeOuts))
	{
		CString strError;
		strError.Format(_T("设置超时失败,错误编号为:%d"),GetLastError());
		MessageBox(0 , strError , _T("错误") , MB_OK | MB_ICONERROR);
		return FALSE;
	}

	EscapeCommFunction (m_hCom, SETDTR);
	EscapeCommFunction (m_hCom, SETRTS);
	return TRUE;
}


//向串口发送命令
BOOL CSerial::WriteCommand(BOOL	bCtrlFlag)
{
	BOOL	bWriteState;
	DWORD	dwBytesWritten;

	UCHAR	arrCmd[] = {0xAA, (UCHAR)bCtrlFlag, 0x55};
	bWriteState = WriteFile(m_hCom , arrCmd , 3 , &dwBytesWritten , NULL);

	if((!bWriteState) || (3 != dwBytesWritten))
	{
		MessageBox(0 , _T("不能够将数据写入串口") , _T("错误") , MB_OK | MB_ICONERROR);
		return FALSE;
	}	

	return bWriteState;
}

BOOL CSerial::WriteCommand(UCHAR* pData)
{
	BOOL	bWriteState;
	DWORD	dwBytesWritten;

	UCHAR	arrCmd[] = {0xAA, pData[0], pData[1], pData[2], pData[3], pData[4], pData[5], pData[6], pData[7], 0x55};
	bWriteState = WriteFile(m_hCom , arrCmd , 10 , &dwBytesWritten , NULL);

	if((!bWriteState) || (10 != dwBytesWritten))
	{
		MessageBox(0 , _T("不能够将数据写入串口") , _T("错误") , MB_OK | MB_ICONERROR);
		return FALSE;
	}	

	return bWriteState;
}

BOOL CSerial::ReadDataFromSerial()
{.


	BOOL	bReadState;
	DWORD   dwErrorFlags;
	COMSTAT	ComStat;
	DWORD	dwDataLen;
	DWORD	dwReadLen;
	////设置下一状态为发送命令状态
	ClearCommError(m_hCom , &dwErrorFlags , &ComStat);
	//cbInQue中传回的是缓冲区中数据的字节数
	dwDataLen = ComStat.cbInQue;
	

	//读数据
	bReadState = ReadFile(m_hCom , m_arrDataBuf , 10 , &dwReadLen , NULL);
	ClearCommError(m_hCom , &dwErrorFlags , &ComStat);
	dwDataLen = ComStat.cbInQue;
	//如果读取成功则进行数据处理
	if(bReadState)
	{
		if((0xaa==m_arrDataBuf[0]) && (0x55==m_arrDataBuf[9]))
		{
			for(BYTE i=1; i<9; i++)
			{
				TRACE(TEXT("返回的数值为:%d\n"), m_arrDataBuf[i]);
			}
			return TRUE;
		}
	}
	return FALSE;
}

void CSerial::AnalyzeReturnData(BOOL& bTurnOn, BOOL& bBtnDown)
{
	bTurnOn  = FALSE;
	bBtnDown = FALSE;
	if(1 == m_arrDataBuf[1])
	{
		bTurnOn = TRUE;
	}

	if(1 == m_arrDataBuf[2])
	{
		bBtnDown = TRUE;
	}
}

⌨️ 快捷键说明

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