亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? yscomm.cpp

?? 使用VC++編寫
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
  dcb.StopBits = ONESTOPBIT;  // one stop bit
  dcb.fAbortOnError=FALSE;

  //dcb.EofChar=1;
	//dcb.fRtsControl=DTR_CONTROL_DISABLE;
  if(m_bSemiduplex)
	dcb.fRtsControl=RTS_CONTROL_TOGGLE;//半雙工
  else dcb.fRtsControl=RTS_CONTROL_ENABLE;//用來控制modem

  SetupComm(m_hFileHandle,2048,2048);//setup comm buffer size

  /*  COMMTIMEOUTS  TimeOuts;
	//Setup timeout
	TimeOuts.ReadIntervalTimeout=MAXDWORD; 
	TimeOuts.ReadTotalTimeoutMultiplier=0; 
	TimeOuts.ReadTotalTimeoutConstant=0; 
	TimeOuts.WriteTotalTimeoutMultiplier=100; 
	TimeOuts.WriteTotalTimeoutConstant=1000;
	SetCommTimeouts(m_hFileHandle, &TimeOuts);
*/

  Purge(PURGE_ALL);
  fSuccess = SetCommState(m_hFileHandle, &dcb);


  if (!fSuccess) 
  {
      // Handle the error.
      TRACE(_TEXT("SetCommState failed with error %d.\n"), GetLastError());
      return FALSE;
  }
//  EscapeCommFunction(m_hFileHandle,CLRRTS);//半雙工
  return TRUE;
}

/*************************2001.10.31 ycat *********************************************
FUNCTION: BOOL CYsComm::SetEvent(DWORD dwEvent)

PURPOSE: 設置要等待的串口事件

PARAMETERS:
		dwEvent:要等待的事件

		EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING |\
		EV_RLSD | EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY 

RETURN VALUE: 
		TRUE表示操做成功,FALSE表示操作失敗

COMMENTS: 目前只支持一種狀態,說明見下一WaitEvent()
*********************************************************************************/
BOOL CYsComm::SetEvent(DWORD dwEvent)
{
	return SetCommMask(m_hFileHandle,dwEvent);
}
/*************************2001.10.31 ycat *********************************************
FUNCTION: int CYsComm::WaitEvent(DWORD* pwdEvent,DWORD dwTimeOut)

PURPOSE: 等待收到某個串口事件

PARAMETERS:
		pwdEvent:所等到的事件
		dwTimeOut:超時設置

RETURN VALUE: 
    -1: 除timeout外其它錯誤
	 1:等待成功
	-2: 表示timeout

COMMENTS: 
		Note   The Microsoft Win32 SDK Knowledge Base documents 
	a problem with Windows 95 and the EV_RING flag.
	The above code never returns in Windows 95 because
	the EV_RING event is not detected by the system;
	Windows NT properly reports the EV_RING event.
	Please see the Win32 SDK Knowledge Base for more 
	information on this bug.

		There are two interesting side effects of SetCommMask
	and WaitCommEvent. First, if the communications port 
	is open for nonoverlapped operation, WaitCommEvent 
	will be blocked until an event occurs. 

		If another thread calls SetCommMask to set a new event mask,
	that thread will be blocked on the call to SetCommMask. 
	The reason is that the original call to WaitCommEvent 
	in the first thread is still executing. 

		The call to SetCommMask blocks the thread until
	the WaitCommEvent function returns in the first 
	thread. This side effect is universal for ports
	open for nonoverlapped I/O. If a thread is blocked
	on any communications function and another thread
	calls a communications function, the second thread
	is blocked until the communications function returns 
	in the first thread. 

		The second interesting note about
	these functions is their use on a port open for overlapped 
	operation. If SetCommMask sets a new event mask,
	any pending WaitCommEvent will complete successfully,
	and the event mask produced by the operation is NULL.

	如果用重疊IO,則SetCommMask使正在等待的WaitCommEvent馬上返回,
	而且返回的事件為NULL

	出錯時返回負數,但DWORD為無符號數,會不會出問題?
	目前只支持等待一個事件
**********************************************************************/
int CYsComm::WaitEvent(DWORD* pwdEvent,DWORD dwTimeOut)
{
	  if(m_hFileHandle==NULL) return -1;
	  DWORD nRet;
	  DWORD dwRes;
	  DWORD dwOvRes;
	  int i;
	  
//	  if(!SetCommMask(m_hFileHandle,EV_RXCHAR))
//		  return -1;//清除以前事件
	 // WaitCommEvent(m_hFileHandle,pwdEvent,NULL);

      // Issue a status event check if one hasn't been issued already.
      if (WaitCommEvent(m_hFileHandle,pwdEvent,&m_overlappedEvent))
	  {
            // WaitCommEvent returned immediately.
            // Deal with status event as appropriate.
            DoStateEvent(*pwdEvent); 
			nRet=1;
			goto Exit;
      }

	  i=GetLastError();
	  // error in WaitCommEvent; abort
      if (i!= ERROR_IO_PENDING)
	  {
		  nRet=-1;
		  TRACE(_TEXT("GetlastError %d\n"),i);
		  goto Exit;
	  }
      // Check on overlapped operation.
      // Wait a little while for an event to occur.
      dwRes = WaitForSingleObject(m_overlappedEvent.hEvent, dwTimeOut);
      switch(dwRes)
       {
        // Event occurred.
	       case WAIT_OBJECT_0: 
                if (GetOverlappedResult(m_hFileHandle,&m_overlappedEvent,&dwOvRes,FALSE))
				{
                    // Status event is stored in the event flag
                    // specified in the original WaitCommEvent call.
                    // Deal with the status event as appropriate.
                    DoStateEvent(*pwdEvent);
					nRet=1;
					goto Exit;
				}
				else 
				{
                    // An error occurred in the overlapped operation;
                    // call GetLastError to find out what it was
                    // and abort if it is fatal.
					TRACE(_TEXT("An error occurred in the overlapped operation\nGetLastError is %d\n "),
						GetLastError());
					nRet=-1;
					goto Exit;
				}
                break;
             case WAIT_TIMEOUT:
				nRet=-2;
				goto Exit;
                break;                       
             default:
				nRet=-1;
				goto Exit;
         }
Exit:
	return nRet;
}
/*
對串口事件進行處理,還要修改
返回值無意義
*/
BOOL CYsComm::DoStateEvent(DWORD dwEvtMask)
{
	if(dwEvtMask==NULL) return TRUE;
//dwEvtMask可能會為NULL
		if (dwEvtMask & EV_BREAK) //檢測到轉入的中止
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_BREAK,m_nPort);
		}
		if (dwEvtMask & EV_CTS) //CTS (清除發送)信號改變狀態
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_CTS,m_nPort);
		}
		if (dwEvtMask & EV_DSR) //DSR (數據設置就緒) 信號改變狀態
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_DSR,m_nPort);
		}
		if (dwEvtMask & EV_ERR) //發生線路狀態錯誤
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_ERR,m_nPort);
		}
		if (dwEvtMask & EV_RING)//檢測到振鈴
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_RING,m_nPort);
		}
		if (dwEvtMask & EV_RLSD)//RLSD(接收線路信號檢測)信號改變狀態
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_RLSD,m_nPort);
		}
		if (dwEvtMask & EV_RXCHAR)//收到一個字符,并放入輸入緩沖區
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_RXCHAR,m_nPort);
		}
		if (dwEvtMask & EV_RXFLAG) //收到事件字符(DCB結構的EvtChar成員),并放入輸入緩沖區
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_RXFLAG,m_nPort);
		}
		if (dwEvtMask & EV_TXEMPTY)//輸出緩沖區最后一個字符發送出去
		{
			if(m_hWnd)PostMessage(m_hWnd,WM_YSCOMM_MESSAGE,WM_EV_TXEMPTY,m_nPort);
		}
	return TRUE;
}

//一個例子,供參考
/*************************2001.10.30 ycat *********************************************
FUNCTION: UINT CATModem::ReadCommThread(LPVOID pParam)

PURPOSE: 線程函數,把串口讀入緩沖區的字符,寫到自己維護的緩沖區中,并判斷斷線

PARAMETERS:
		pParam:指向CATModem類

RETURN VALUE:

COMMENTS: 斷線的處理,也許還要改進
**********************************************************************/


/*************************2001.11.06 ycat *********************************************
FUNCTION: int CYsComm::ReadComm(
						PBYTE pByteRead,
						DWORD dwCount,
						DWORD* dwHaveReaded,
						DWORD nTimeOut)

PURPOSE: 在dwReadTimeOut里讀到dwCount個字符,既使超時,
		 在緩沖區里也有在超時之前讀出來的數據

PARAMETERS:
		pByteRead:			存放返回數據的字符串緩沖區
		dwCount:			希望要讀到的字符個數
		dwHaveReaded:		已經讀到的數據
		dwReadTimeOut:		超時的時間

RETURN VALUE:
	   -1: 除-2,-3之外的其它錯誤
		1:表示寫com口成功
		-2:表示超時
		-3: 表示讀操作被停止


COMMENTS:
        不能支持多線程

		即使沒有讀夠dwCount個數,緩沖區里的字符仍然有效

		注意和ReadIn()的區別
**********************************************************************/
/*int CYsComm::ReadComm(PBYTE pByteRead,DWORD dwCount,
			DWORD* dwHaveReaded,DWORD nTimeOut)
{
	int nRet;
	DWORD dwTimeAfter;
	DWORD dwTimeUsed;
	DWORD dwTimeBefore;

	for(DWORD i=0;i<dwCount;i++)
	{
		dwTimeBefore=GetTickCount();
		nRet=ReadIn(pByteRead+i,1,nTimeOut);

		if(nRet==-2)//超時
		{
		//	TRACE(_TEXT("ReadComm Timeout %ld \n"),nTimeOut);
			goto Exit;
		}
		else if(nRet!=1) //出錯
		{
			TRACE(_TEXT("ReadComm Error %ld \n"),nRet);
			goto Exit;
		}

		dwTimeAfter=GetTickCount();
		dwTimeUsed=dwTimeAfter-dwTimeBefore;

		if(dwTimeUsed>nTimeOut)
		{
			if(i<dwCount)
			{
				nRet=-2;//TimeOut
				goto Exit;
			}
			else 
			{
				nRet=1;
				goto Exit;
			}
		}
		//計算剩下的時間
		nTimeOut-=dwTimeUsed;
	}
	nRet=1;
Exit:
	*dwHaveReaded=i;
	return nRet;
}
*/
/*************************2001.10.31 ycat *********************************************
FUNCTION: int CYsComm::ReadComm(PBYTE buffer,
			DWORD dwRead,
			LPDWORD pdwReaded,
			DWORD dwStartTimeOut,
			DWORD dwInterTimeOut)

PURPOSE: 讀從dwStartTimeOut時間開始,以dwInterTimeOut為時間間隔,
		的字符


PARAMETERS:
			buffer:			緩沖區
			dwRead:			希望讀到的長度
			pdwReaded:		實際讀到的長度
			dwStartTimeOut:	最大的開始讀數等待時間
			dwInterTimeOut:	讀每個字符之間的等待時間

RETURN VALUE:
	   -1: 除-2,-3之外的其它錯誤
		1:表示寫com口成功
		-2:表示超時
		-3: 表示讀操作被停止

COMMENTS:
		有兩種超時可能

		即使超時,緩沖區里的字符串仍然有效
	
		讀出緩沖區里的數據,時間處理有問題? 有待測試
	希望讀到的長度讀到時,是否正常? 有待測試
**********************************************************************/
int CYsComm::ReadComm(PBYTE pByteRead,
			DWORD dwCount,
			LPDWORD dwHaveReaded,
			DWORD dwStartTimeOut,
			DWORD dwInterTimeOut)
{
	int nRet;
	DWORD dwTimeAfter;
	DWORD dwTimeUsed;
	DWORD dwTimeBefore;
	DWORD i=0;

	nRet=ReadIn(pByteRead+i,1,dwStartTimeOut);
	if(nRet!=1)
	{
		TRACE(_TEXT("ReadComm Error %ld \n"),nRet);
		goto Exit;
	}

	for(i=1;i<dwCount;i++)
	{
		dwTimeBefore=GetTickCount();
		nRet=ReadIn(pByteRead+i,1,dwInterTimeOut);
		if(nRet!=1)
		{
			TRACE(_TEXT("ReadComm Error %ld \n"),nRet);
			goto Exit;
		}
		dwTimeAfter=GetTickCount();
		dwTimeUsed=dwTimeAfter-dwTimeBefore;

		if(dwTimeUsed>dwInterTimeOut)
		{
			if(i<dwCount)
			{
				nRet=-2;//TimeOut
				goto Exit;
			}
			else 
			{
				nRet=1;
				goto Exit;
			}
		}
		//計算剩下的時間
		dwInterTimeOut-=dwTimeUsed;
	}
	nRet=1;
Exit:
	*dwHaveReaded=i;
	return nRet;
}
BOOL CYsComm::StopRead()
{
	return PulseEvent(m_hStopReadEvent);
}
BOOL CYsComm::StopWrite()
{
	return PulseEvent(m_hStopWriteEvent);
}

int CYsComm::ReadComm(PBYTE lpszInputBuffer,DWORD dwCountoByte,
			DWORD* dwHaveReaded,DWORD dwReadTimeOut)
{
	if ( m_hFileHandle == NULL)
	{
		TRACE(_TEXT("m_hFileHandle error.\n"));
		return -1;
	}
	int nRet;
    DWORD dwLastError;
    DWORD dwHandleSignaled;
    HANDLE HandlesToWaitFor[2];
	int iWait=2;
   // HandlesToWaitFor[0] = g_hCloseEvent;//為了支持多線程
	//OVERLAPPED o={0};
	//o.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	
    HandlesToWaitFor[0] = m_overlappedRead.hEvent;
	HandlesToWaitFor[1] = m_hStopReadEvent;


	if (ReadFile((HANDLE)m_hFileHandle, 
		(LPVOID)lpszInputBuffer,
		(DWORD)dwCountoByte,
		(LPDWORD)dwHaveReaded,
		(LPOVERLAPPED)&m_overlappedRead))
	{  // This would only happen if there was data waiting to be read.
		
	//	TRACE(_TEXT("there waw data waiting to be read.\n");
		nRet=1;
		goto Exit;
	}
	// ReadFile failed.  Expected because of overlapped I/O.
	dwLastError = GetLastError();
	
	// Its possible for this error to occur if the 
	// service provider has closed the port.  Time to end.
	if (GetLastError()!= ERROR_IO_PENDING)
	{
		TRACE(_TEXT("Error to reading to CommFile %x\n"),dwLastError);
		nRet=-1;
		goto Exit;
	}
	
	// This is the expected ERROR_IO_PENDING case.
	
	// Wait for either overlapped I/O completion,
	// or for the CloseEvent to get signaled.
	dwHandleSignaled = 
		WaitForMultipleObjects(iWait,HandlesToWaitFor, 
		FALSE,dwReadTimeOut);
	switch(dwHandleSignaled)
	{
	case WAIT_OBJECT_0 : // Wait finished.
		{
			// Time to get the results of the WriteFile
			break;
		}
	case WAIT_OBJECT_0+1 : // Wait finished.
		{
			TRACE(_TEXT("stop read event set\n"));
			nRet=-3;
			goto Exit;
		}		
	case WAIT_TIMEOUT :
		{
//			TRACE(_TEXT("read time out\n"));
			nRet=-2;
			goto Exit;
		}
		
	case WAIT_FAILED: // Wait failed.  Shouldn't happen.
		{
			TRACE(_TEXT("read WAIT_FAILED: \n "));

			nRet=-1;
			goto Exit;
		}
		
	default: // This case should never occur.
		{
			TRACE(_TEXT("Unexpected Wait return value '%x'"),dwHandleSignaled);
			nRet=-1;
			goto Exit;			
		}
	}
	
	if (GetOverlappedResult(m_hFileHandle,
		&m_overlappedRead,dwHaveReaded, FALSE))
    {
		nRet=1;
		goto Exit;
	}
	else
	{
		//cause by Purge(PURGE_RXABORT)
		TRACE(_TEXT("read operation error \n "));
		nRet=-1;
	}
Exit:
/*	if(nRet==1)
	{
		for(UINT i=0;i<*dwHaveReaded;i++)
		TRACE("@@@ %x  %c @@@\n",lpszInputBuffer[i],lpszInputBuffer[i]);
	}//test*/
	if(nRet!=1) Purge(PURGE_RXABORT);//取消讀操作
	return nRet;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线不卡a资源高清| 久久精品久久99精品久久| 国产激情一区二区三区| 欧美大肚乱孕交hd孕妇| 日韩av成人高清| 911精品产国品一二三产区| 午夜视频在线观看一区二区| 欧美二区三区91| 青娱乐精品视频| 精品国产制服丝袜高跟| 国产精品一卡二卡在线观看| 中文乱码免费一区二区| 成人免费av网站| 艳妇臀荡乳欲伦亚洲一区| 欧美欧美欧美欧美| 国产精品伊人色| 亚洲欧洲精品天堂一级| 欧美日韩成人在线| 久久成人免费电影| 国产精品久久久久永久免费观看 | 99精品黄色片免费大全| 亚洲乱码国产乱码精品精的特点| 色8久久精品久久久久久蜜| 无码av免费一区二区三区试看| 91精品国产欧美一区二区成人| 国产一区二区三区在线看麻豆| 国产精品久久久久久妇女6080| 欧洲亚洲精品在线| 麻豆精品国产传媒mv男同| 国产欧美va欧美不卡在线| 在线亚洲一区观看| 国内精品写真在线观看| 亚洲一区二区三区四区不卡| 欧美成人精品高清在线播放| 91在线观看高清| 久久精品国产亚洲5555| **性色生活片久久毛片| 制服丝袜av成人在线看| 国产传媒日韩欧美成人| 视频在线观看一区| 国产精品视频一二| 欧美另类高清zo欧美| 成人美女在线观看| 麻豆国产精品777777在线| 亚洲免费观看高清| www国产精品av| 欧美午夜视频网站| 大尺度一区二区| 国产又粗又猛又爽又黄91精品| 色综合天天在线| 国产精品欧美一区二区三区| 成人黄色在线视频| 欧美丰满高潮xxxx喷水动漫| 亚洲精品日日夜夜| 欧美久久久久久久久久 | 日本不卡免费在线视频| 国产成人av在线影院| 国产精品三级电影| 欧美一级二级三级蜜桃| 91色|porny| 国产成人在线电影| 奇米亚洲午夜久久精品| 亚洲免费观看高清完整版在线| 日韩免费电影一区| 欧美日本高清视频在线观看| 91社区在线播放| 国产成人亚洲综合a∨婷婷| 免费在线视频一区| 亚洲电影一级片| 亚洲欧美日韩在线播放| 中文字幕一区二区三中文字幕| 久久综合色鬼综合色| 欧美一级夜夜爽| 欧美日本一区二区| 欧美日韩一区小说| 欧美中文一区二区三区| 色婷婷香蕉在线一区二区| 91丨porny丨户外露出| 99视频有精品| 成人av网址在线观看| 成人毛片视频在线观看| 成人18视频在线播放| 风间由美一区二区三区在线观看| 国产揄拍国内精品对白| 狠狠色综合日日| 国内精品久久久久影院一蜜桃| 黑人巨大精品欧美黑白配亚洲| 久久99久国产精品黄毛片色诱| 另类小说欧美激情| 国产美女娇喘av呻吟久久 | 亚洲电影激情视频网站| 亚洲人xxxx| 亚洲日本丝袜连裤袜办公室| 亚洲区小说区图片区qvod| 一区二区三区精品| 无码av免费一区二区三区试看| 午夜a成v人精品| 免费观看日韩电影| 国产毛片一区二区| av在线不卡观看免费观看| 色综合久久综合中文综合网| 欧美亚洲国产一区在线观看网站| 欧美日韩一区高清| 日韩美一区二区三区| 久久伊人蜜桃av一区二区| 国产欧美一区二区三区鸳鸯浴 | 91黄色免费网站| 欧美日韩成人在线一区| 精品人在线二区三区| 国产日韩三级在线| 亚洲日本在线观看| 美女精品一区二区| 成人黄页毛片网站| 7777女厕盗摄久久久| 日本一区二区三区久久久久久久久不 | 久久91精品久久久久久秒播| 成人av免费在线观看| 欧美日韩一区二区在线观看 | 中文字幕免费在线观看视频一区| 一区二区在线观看视频| 免费成人在线观看| 成人黄色综合网站| 日韩欧美一区二区视频| 国产精品沙发午睡系列990531| 亚洲五码中文字幕| 国产精品一区二区久久不卡 | 欧美无乱码久久久免费午夜一区| 精品久久久久一区| 一区二区欧美视频| 国产又黄又大久久| 欧美精品丝袜中出| 国产精品久久99| 日本怡春院一区二区| bt欧美亚洲午夜电影天堂| 欧美美女激情18p| 国产日产欧产精品推荐色| 亚洲成人av一区二区三区| 成人一区二区三区在线观看| 欧美男男青年gay1069videost| 国产精品初高中害羞小美女文| 美女在线一区二区| 欧美做爰猛烈大尺度电影无法无天| 久久婷婷色综合| 午夜精品福利在线| 色天天综合色天天久久| 国产三级精品视频| 狠狠网亚洲精品| 欧美丰满少妇xxxxx高潮对白| 最新国产成人在线观看| 国产麻豆视频一区| 精品国产免费久久| 日本在线不卡视频一二三区| 色av成人天堂桃色av| 国产精品久久久久久亚洲伦| 精品亚洲免费视频| 欧美一激情一区二区三区| 一区二区三区在线观看欧美| 成人在线一区二区三区| 久久久国产精品午夜一区ai换脸| 日韩制服丝袜av| 欧美在线综合视频| 一区在线播放视频| 成人福利视频网站| 中文字幕精品—区二区四季| 床上的激情91.| 精品播放一区二区| 奇米精品一区二区三区在线观看 | 国产精品一二三在| 欧美变态tickling挠脚心| 老司机免费视频一区二区| 欧美一区二区三区喷汁尤物| 爽好久久久欧美精品| 欧美挠脚心视频网站| 日韩在线一区二区三区| 91精品久久久久久久99蜜桃| 天堂久久一区二区三区| 欧美精品乱人伦久久久久久| 日韩精品亚洲一区二区三区免费| 欧美日本高清视频在线观看| 日韩不卡一区二区| 精品久久久久久综合日本欧美| 精品一区二区免费看| 国产亚洲欧洲一区高清在线观看| 国产乱码一区二区三区| 中文子幕无线码一区tr| av毛片久久久久**hd| 亚洲美女视频在线| 欧美日韩一级片在线观看| 日韩高清不卡在线| 久久无码av三级| 成人综合激情网| 亚洲男人的天堂网| 欧美乱妇23p| 韩国中文字幕2020精品| 中文字幕欧美日韩一区| 欧洲精品一区二区| 免费一级片91| 国产欧美日韩在线| 欧美中文一区二区三区| 青青草97国产精品免费观看无弹窗版|