非常好用的串口读写类

资源地址:http://download.youkuaiyun.com/detail/spygg/5318388
非常好用,鉴于我研究了很久而且到处下载别人的代码来研究都不好用,自己弄了一个非得好用,是一个类直接可以用到别的程序。里面,关键的底层读写函数没有给出,可以到我的资源里面去找,没有积分了所以想赚点积分,想下载的到我的空间里面去下载(10个积分,我太黑了,嘿嘿)。。


BOOL CSerialCom::InitSerial( UINT uCom , UINT uBaudRate )
{
	m_hCom=CreateFile("COM2",//COM1口
		GENERIC_READ|GENERIC_WRITE, //允许读和写
		0, //独占方式
		NULL,
		OPEN_EXISTING, //打开而不是创建
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式
		NULL);
	if(m_hCom==(HANDLE)-1)
	{
		AfxMessageBox("打开COM失败!");
		return FALSE;
	}
	
	SetupComm(m_hCom,100,100); //输入缓冲区和输出缓冲区的大小都是100
	
	COMMTIMEOUTS TimeOuts;
	//设定读超时
	TimeOuts.ReadIntervalTimeout=MAXDWORD;
	TimeOuts.ReadTotalTimeoutMultiplier=0;
	TimeOuts.ReadTotalTimeoutConstant=0;
	//在读一次输入缓冲区的内容后读操作就立即返回,
	//而不管是否读入了要求的字符。
	
	
	//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier=100;
	TimeOuts.WriteTotalTimeoutConstant=500;
	SetCommTimeouts(m_hCom,&TimeOuts); //设置超时
	
	DCB dcb;
	GetCommState(m_hCom,&dcb);
	dcb.BaudRate=9600; //波特率为9600
	dcb.ByteSize=8; //每个字节有8位
	dcb.Parity=NOPARITY; //无奇偶校验位
	dcb.StopBits=TWOSTOPBITS; //两个停止位
	SetCommState(m_hCom,&dcb);
	
	//清除缓冲区
	PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
	
	return TRUE;
}

void CSerialCom::SendData( char * cSendBuffer )
{
	OVERLAPPED osWrite;
	memset(&osWrite,0,sizeof(OVERLAPPED));
	osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	
	DWORD dwBytesWrite=9;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	BOOL bWriteStat;
	ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
	
	bWriteStat = SerialWrite(m_hCom, (char*)cSendBuffer , dwBytesWrite, &dwBytesWrite, &osWrite);	
	
	if ( bWriteStat != STATE_SUCCESS )
	{  
		//Sending package ok
		OutputDebugString("发送错误!\n");
	}
	// 清理发送缓冲区
	PurgeComm(m_hCom, PURGE_TXCLEAR);
}

void CSerialCom::RecvData( char *cRecvBuff )
{
	OVERLAPPED ovRead;
	
	memset(&ovRead, 0, sizeof(OVERLAPPED));
	ovRead.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

	int nReadCount = 9;

	DWORD ulErrorCode = 0;
	DWORD ulNumberofRead;

	if (!SetCommMask(m_hCom, EV_RXCHAR | EV_TXEMPTY))
		return; 
	
	while(1)
	{
		memset(m_cFrameBuf, 0, sizeof(m_cFrameBuf));
		int nRet = SerialWaitEvent( m_hCom, (char*)m_cFrameBuf, nReadCount, &ulNumberofRead, &ulErrorCode, &ovRead);

		CString szstr,strtmp;
		
		if(nRet == STATE_SUCCESS)
		{
			//处理...
		}

	}

	CloseHandle(ovRead.hEvent);
}

int CSerialCom::SerialWaitEvent(HANDLE hDevice, char *pbyData, ULONG ulReadCount, ULONG *pulNumberofRead, ULONG *ErrorCode, OVERLAPPED *ov)
{
	ULONG Code = 0;
	int nRet = OPERATION_ERROR;
	
	if (WaitCommEvent(hDevice, &Code, ov) == TRUE)
	{
		if ((Code & EV_RXCHAR) != 0)
		{
			nRet = SerialRead(hDevice, pbyData, ulReadCount, pulNumberofRead, ov);
		}
		if ((Code & EV_ERR) != 0)
		{
			nRet = OPERATION_ERROR;
			SerialClearCommError(hDevice, ErrorCode);
		}
	}
	else
	{
		ULONG ulErr = GetLastError();
		if (ERROR_IO_PENDING == ulErr)
		{
			if (GetOverlappedResult(hDevice, ov, pulNumberofRead, TRUE))
			{
				if ((Code & EV_RXCHAR) != 0)
				{
					nRet = SerialRead(hDevice, pbyData, ulReadCount, pulNumberofRead, ov);
				}
				if ((Code & EV_ERR) != 0)
				{
					nRet = OPERATION_ERROR;
					SerialClearCommError(hDevice, ErrorCode);
				}
			}
		}
	}
	
	return nRet;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值