Win32串口异步读写函数


int CSerial::Write(BYTE *pBuf, DWORD nSize)
{
	COMSTAT		ComStat;
	DWORD		dwErrorFlags;
	DWORD       dwBytesWritten;
	OVERLAPPED	osWrite;
	BOOL		bWriteStat;
	DWORD       dwEventStat;

	memset(&osWrite, 0, sizeof(OVERLAPPED));

	osWrite.hEvent = _hWrEvt;

	ClearCommError(_hCom,&dwErrorFlags,&ComStat);

	bWriteStat=WriteFile(_hCom, pBuf, nSize, &dwBytesWritten, &osWrite);
	if(!bWriteStat)
	{
		if(GetLastError()==ERROR_IO_PENDING)
		{
			do{
				dwEventStat = WaitForSingleObject(osWrite.hEvent, 200);
			}while(dwEventStat == WAIT_TIMEOUT);

			if(dwEventStat == WAIT_OBJECT_0) //write done.
			{
				if(GetOverlappedResult(_hCom, &osWrite, &dwBytesWritten, TRUE))
				{
					return dwBytesWritten;
				}
			}			
		}

		//Reset Send Error.
		ResetTx();
		return 0;
	}

	return dwBytesWritten;
}

int CSerial::Read(BYTE *pBuf, DWORD nSize)
{
	COMSTAT		ComStat;
	DWORD       dwEventStat;
	DWORD       dwBytesRead;
	DWORD		dwErrorFlags;
	OVERLAPPED	osRead;
	BOOL		bReadStatus;

	if(!isValid())
		return -1;

	memset(&osRead,0,sizeof(OVERLAPPED));
	osRead.hEvent = _hRdEvt;

	ClearCommError(_hCom,&dwErrorFlags,&ComStat);
	//if(!ComStat.cbInQue)
	//	return 0;

	dwBytesRead=min(nSize, (DWORD)ComStat.cbInQue);

	bReadStatus = ReadFile(_hCom, pBuf, dwBytesRead, &dwBytesRead, &osRead);
	if(!bReadStatus) //如果ReadFile函数返回FALSE
	{
		if(GetLastError()==ERROR_IO_PENDING)
		{
			do{
				dwEventStat = WaitForSingleObject(osRead.hEvent, 200);
			}while(dwEventStat == WAIT_TIMEOUT);

			if(dwEventStat == WAIT_OBJECT_0) //write done.
			{
				if(GetOverlappedResult(_hCom, &osRead, &dwBytesRead, TRUE))
				{
					return dwBytesRead;
				}
			}	
		}

		ResetTx();

		return 0;
	}
	
	return dwBytesRead;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值