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

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

?? mycom.cpp

?? 串口通信源碼 大家多學習交流啊 謝謝了 多多指教
?? CPP
字號:
#include "stdafx.h"
#include "MyCom.h"



CComStatus::CComStatus()
{
	m_hCom = NULL;
	m_bComId = (char)1;//COM1

	m_bByteSize=8;
	m_bStopBits=ONESTOPBIT;
	m_bParity=NOPARITY;
	m_dwBaudRate=9600;

	m_bEvtChar=EVENTCHAR;
	m_fBinary=1;

	m_bConnected = FALSE;
	m_bFlowCtrl = FC_XONXOFF ;
	m_fXonXoff = FALSE;
}

void CComStatus::Set(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,
		DWORD dwBaudRate,char bEvtChar,DWORD fBinary)
{
	m_hCom = NULL;
	m_bComId = bComId;

	m_bByteSize=bByteSize;
	m_bStopBits=bStopBits;
	m_bParity=bParity;
	m_dwBaudRate=dwBaudRate;

	m_bEvtChar=bEvtChar;
	m_fBinary=fBinary;

	m_bConnected = FALSE;
	m_bFlowCtrl = FC_XONXOFF ;
	m_fXonXoff = FALSE;

}
BOOL CComStatus::OpenConnection()
{
	char csCom[10];
    COMMTIMEOUTS  CommTimeOuts ;

    if((m_bComId < 0) || (m_bComId > 4))
		return FALSE;//從COM1到COM4
	if(m_hCom)//if already open
		return FALSE;
    //OVERLAPPED包含異步I/O信息
	m_rdos.Offset = 0;
	m_rdos.OffsetHigh = 0;
	m_rdos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	if(m_rdos.hEvent == NULL)
		return FALSE;
	m_wtos.Offset = 0;
	m_wtos.OffsetHigh = 0;
	m_wtos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	if(m_wtos.hEvent == NULL)
	{
		CloseHandle(m_rdos.hEvent);
		return FALSE;
	}
	

	wsprintf(csCom,"COM%d",m_bComId);
	m_hCom = CreateFile(csCom,GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
    NULL
	);

	if(m_hCom == INVALID_HANDLE_VALUE) {
		//dwError = GetLastError();
	    // handle error 
		return FALSE;
	}
	else
	{
      // get any early notifications

      SetCommMask( m_hCom, EV_RXCHAR ) ;

      // setup device buffers

      SetupComm( m_hCom, 4096, 4096 ) ;

      // purge any information in the buffer

      PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |
                                      PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

      // set up for overlapped I/O
	  DWORD dwTemp = 1000 / (this->m_dwBaudRate / 8);
      CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
      CommTimeOuts.ReadTotalTimeoutMultiplier = 0;//((dwTemp > 0) ? dwTemp : 1);
      CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
      // CBR_9600 is approximately 1byte/ms. For our purposes, allow
      // double the expected time per character for a fudge factor.
      
      CommTimeOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600/this->m_dwBaudRate;//( npTTYInfo ) ;
      CommTimeOuts.WriteTotalTimeoutConstant = 0;//1000 ;
      SetCommTimeouts( m_hCom, &CommTimeOuts ) ;
	}
	if(!SetupConnection())
	{
		CloseConnection();
		return FALSE;
	}
	EscapeCommFunction( m_hCom, SETDTR );
	m_bConnected = TRUE;
	return TRUE;
}
BOOL CComStatus::CloseConnection()
{
   if (NULL == m_hCom)
      return ( TRUE ) ;

   // set connected flag to FALSE

	m_bConnected = FALSE;
   // disable event notification and wait for thread
   // to halt

   SetCommMask( m_hCom, 0 ) ;

   // block until thread has been halted

   //while(THREADID(npTTYInfo) != 0);

   // kill the focus

   //KillTTYFocus( hWnd ) ;

   // drop DTR

   EscapeCommFunction( m_hCom, CLRDTR ) ;

   // purge any outstanding reads/writes and close device handle

   PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |
                                   PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
   CloseHandle( m_hCom ) ;
	m_hCom = NULL;

	CloseHandle(m_rdos.hEvent);
	CloseHandle(m_wtos.hEvent);

   return ( TRUE ) ;
}

BOOL CComStatus::SetupConnection()
{
   BOOL       fRetVal ;
   BYTE       bSet ;
   DCB        dcb ;
	if(m_hCom == NULL)
		return FALSE; 
   dcb.DCBlength = sizeof( DCB ) ;

   GetCommState( m_hCom, &dcb ) ;

   dcb.BaudRate = this->m_dwBaudRate;
   dcb.ByteSize = this->m_bByteSize;
   dcb.Parity =  this->m_bParity;
   dcb.StopBits = this->m_bStopBits ;
	dcb.EvtChar = this->m_bEvtChar ;
   // setup hardware flow control

   bSet = (BYTE) ((m_bFlowCtrl & FC_DTRDSR) != 0) ;
   dcb.fOutxDsrFlow = bSet ;
   if (bSet)
      dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;
   else
      dcb.fDtrControl = DTR_CONTROL_ENABLE ;

   bSet = (BYTE) ((m_bFlowCtrl & FC_RTSCTS) != 0) ;
	dcb.fOutxCtsFlow = bSet ;
   if (bSet)
      dcb.fRtsControl = RTS_CONTROL_HANDSHAKE ;
   else
      dcb.fRtsControl = RTS_CONTROL_ENABLE ;

   // setup software flow control

   bSet = (BYTE) ((m_bFlowCtrl & FC_XONXOFF) != 0) ;

   dcb.fInX = dcb.fOutX = bSet ;
   dcb.XonChar = ASCII_XON ;
   char xon = ASCII_XON ;
   dcb.XoffChar = ASCII_XOFF ;
    char xoff = ASCII_XOFF ;
    dcb.XonLim = 100 ;
   dcb.XoffLim = 100 ;


   dcb.fBinary = TRUE ;
   dcb.fParity = TRUE ;

   fRetVal = SetCommState( m_hCom, &dcb ) ;

   return ( fRetVal ) ;

} 

BOOL CComStatus::IsConnected()
{
	return m_bConnected;
}


//  Description:
//     Reads a block from the COM port and stuffs it into
//     the provided buffer.
//
//  Parameters:
//     HWND hWnd
//        handle to TTY window
//
//     LPSTR lpszBlock
//        block used for storage
//
//     int nMaxLength
//        max length of block to read

int ReadCommBlock(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength )
{
   BOOL       fReadStat ;

   COMSTAT    ComStat ;
   DWORD      dwErrorFlags;
   DWORD      dwLength;
   DWORD      dwError;
   char       szError[ 10 ] ;

   // only try to read number of bytes in queue
   ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;
   dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;

   if (dwLength > 0)
   {
      fReadStat = ReadFile( comDev.m_hCom, lpszBlock,
		                    dwLength, &dwLength, &(comDev.m_rdos) ) ;
      if (!fReadStat)
      {
         if (GetLastError() == ERROR_IO_PENDING)
         {
            OutputDebugString("\n\rIO Pending");
            // We have to wait for read to complete.
            // This function will timeout according to the
            // CommTimeOuts.ReadTotalTimeoutConstant variable
            // Every time it times out, check for port errors
            while(!GetOverlappedResult( comDev.m_hCom ,
               &(comDev.m_rdos), &dwLength, TRUE ))
            {
               dwError = GetLastError();
               if(dwError == ERROR_IO_INCOMPLETE)
                  // normal result if not finished
                  continue;
               else
               {
                  // an error occurred, try to recover
                  wsprintf( szError, "<CE-%u>", dwError ) ;
                  ClearCommError( comDev.m_hCom , &dwErrorFlags, &ComStat ) ;
                  break;
               }

            }

	      }
         else
         {
            // some other error occurred
            dwLength = 0 ;
            ClearCommError( comDev.m_hCom , &dwErrorFlags, &ComStat ) ;
         }
      }
   }

   return ( dwLength ) ;

}


//     Writes a block of data to the COM port specified in the associated
//     TTY info structure.
//
//  Parameters:
//     HWND hWnd
//        handle to TTY window
//
//     BYTE *pByte
//        pointer to data to write to port

BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite)
{

   BOOL        fWriteStat ;
   DWORD       dwBytesWritten ;
   DWORD       dwErrorFlags;
   DWORD   		dwError;
   DWORD       dwBytesSent=0;
   COMSTAT     ComStat;
   char        szError[ 128 ] ;

   fWriteStat = WriteFile( comDev.m_hCom , lpByte, dwBytesToWrite,
                           &dwBytesWritten, &( comDev.m_wtos) ) ;

   // Note that normally the code will not execute the following
   // because the driver caches write operations. Small I/O requests
   // (up to several thousand bytes) will normally be accepted
   // immediately and WriteFile will return true even though an
   // overlapped operation was specified

   if (!fWriteStat)
   {
      if(GetLastError() == ERROR_IO_PENDING)
      {
         // We should wait for the completion of the write operation
         // so we know if it worked or not

         // This is only one way to do this. It might be beneficial to
         // place the write operation in a separate thread
         // so that blocking on completion will not negatively
         // affect the responsiveness of the UI

         // If the write takes too long to complete, this
         // function will timeout according to the
         // CommTimeOuts.WriteTotalTimeoutMultiplier variable.
         // This code logs the timeout but does not retry
         // the write.

         while(!GetOverlappedResult( comDev.m_hCom,
            &(comDev.m_wtos), &dwBytesWritten, TRUE ))
         {
            dwError = GetLastError();
            if(dwError == ERROR_IO_INCOMPLETE)
            {
               // normal result if not finished
               dwBytesSent += dwBytesWritten;
               continue;
            }
            else
            {
               // an error occurred, try to recover
               wsprintf( szError, "<CE-%u>", dwError ) ;
               ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;
               break;
            }
         }

         dwBytesSent += dwBytesWritten;

         if( dwBytesSent != dwBytesToWrite )
             wsprintf(szError,"\nProbable Write Timeout: Total of %ld bytes sent", dwBytesSent);
         else
             wsprintf(szError,"\n%ld bytes written", dwBytesSent);

         OutputDebugString(szError);

      }
      else
      {
         // some other error occurred
         ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;
         return ( FALSE );
      }
   }
   return ( TRUE ) ;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆精品国产自产在线观看一区 | 26uuu亚洲婷婷狠狠天堂| 中文字幕不卡在线观看| 午夜欧美电影在线观看| 成人h动漫精品一区二区| 制服.丝袜.亚洲.另类.中文| 亚洲国产精品成人久久综合一区| 日本不卡高清视频| 欧美精品一区二区三区很污很色的| 中文字幕一区二区三区不卡 | 亚洲男人天堂一区| 国产成人在线视频网站| 日韩午夜激情视频| 五月天激情综合| 色综合久久88色综合天天6| 国产香蕉久久精品综合网| 日本不卡不码高清免费观看| 93久久精品日日躁夜夜躁欧美| 国产三级精品三级| 精品一区二区在线免费观看| 91精品国产乱码久久蜜臀| 一区二区三区久久| 91国产免费观看| 综合色中文字幕| 99久久精品国产麻豆演员表| 国产欧美日韩另类视频免费观看| 久久 天天综合| 精品国产区一区| 久久精品99国产精品| 91精品国产综合久久精品| 亚洲午夜三级在线| 欧美日韩综合在线免费观看| 亚洲激情网站免费观看| 色综合天天性综合| 亚洲欧洲制服丝袜| 欧美性色黄大片手机版| 亚洲五月六月丁香激情| 欧美日韩一区小说| 天堂精品中文字幕在线| 日韩一级在线观看| 美国欧美日韩国产在线播放 | 欧美日韩一区二区三区免费看| 亚洲男人天堂av网| 欧美日韩一区小说| 麻豆国产精品777777在线| 久久综合色一综合色88| 成人网在线播放| 亚洲欧美日韩国产手机在线| 欧美少妇一区二区| 麻豆精品在线视频| 日本一区二区三级电影在线观看| 懂色中文一区二区在线播放| 亚洲乱码国产乱码精品精可以看 | 日韩精品一区二区三区在线播放 | 国产成人综合网站| 精品福利一二区| 国产黄色成人av| 亚洲男人的天堂在线观看| 91成人在线精品| 色乱码一区二区三区88| 亚洲国产欧美在线| 久久美女艺术照精彩视频福利播放| 国产成人免费视频一区| 一区二区三区四区不卡视频| 91麻豆精品国产无毒不卡在线观看| 亚洲v中文字幕| 91精品在线免费| 国产精品自拍三区| 一区二区三区在线高清| 精品国产三级电影在线观看| 99久久99久久精品免费看蜜桃| 亚洲高清视频在线| 国产婷婷色一区二区三区在线| 一本久久a久久免费精品不卡| 日本亚洲欧美天堂免费| 国产精品美女久久久久aⅴ| 欧美日韩午夜影院| 成人的网站免费观看| 日本不卡一二三| 亚洲人吸女人奶水| 欧美不卡一区二区三区四区| 色94色欧美sute亚洲线路一ni | 国产曰批免费观看久久久| 亚洲嫩草精品久久| 国产片一区二区三区| 91麻豆精品国产91久久久使用方法| 国产成人精品综合在线观看| 日韩国产欧美在线观看| 亚洲精品高清在线观看| 国产欧美一区二区精品性色| 91精品欧美一区二区三区综合在 | 国产99久久精品| 免费av网站大全久久| 夜夜精品视频一区二区| 中文字幕欧美国产| 久久综合久久综合久久综合| 欧美少妇性性性| 在线欧美一区二区| 91丝袜呻吟高潮美腿白嫩在线观看| 久久99久久99小草精品免视看| 亚洲在线观看免费视频| 亚洲同性gay激情无套| 欧美激情综合网| 久久日韩精品一区二区五区| 日韩欧美在线网站| 欧美一三区三区四区免费在线看| 91福利视频网站| 91黄色在线观看| 日本精品视频一区二区| 91一区一区三区| 色久综合一二码| 色婷婷亚洲精品| 91麻豆精品秘密| 91福利在线导航| 欧美亚洲综合在线| 欧美影院午夜播放| 欧美三级日韩三级国产三级| 欧美日韩一区二区三区在线| 欧美日韩午夜影院| 正在播放亚洲一区| 精品久久久久久久人人人人传媒 | 2023国产精品自拍| 久久综合久久99| 久久久久国产精品麻豆ai换脸| 久久夜色精品国产噜噜av| 久久先锋影音av鲁色资源网| 国产三级精品三级在线专区| 亚洲国产成人私人影院tom| 国产精品国产三级国产有无不卡| 国产精品免费aⅴ片在线观看| 国产精品亲子乱子伦xxxx裸| 国产精品国产a级| 日韩高清在线电影| 国产伦精品一区二区三区免费迷 | 国产一级精品在线| 国产99久久久国产精品免费看 | 国产v综合v亚洲欧| 成人av在线一区二区| 91极品美女在线| 欧美一级欧美三级在线观看| 久久色视频免费观看| 日韩理论片中文av| 日韩高清电影一区| 国产v日产∨综合v精品视频| 99国产欧美久久久精品| 正在播放一区二区| 日本一区二区三级电影在线观看 | 欧美在线色视频| 日韩美一区二区三区| 国产精品欧美一区二区三区| 亚洲高清在线精品| 国产成人精品免费网站| 色婷婷综合久久久久中文一区二区 | 93久久精品日日躁夜夜躁欧美| 欧美日韩aaaaa| 久久午夜国产精品| 亚洲午夜国产一区99re久久| 国产乱一区二区| 欧美伊人久久久久久久久影院| 精品美女在线播放| 夜色激情一区二区| 国产高清精品在线| 欧美精品久久一区| 中文字幕在线视频一区| 三级欧美在线一区| 91在线观看视频| 久久久精品人体av艺术| 亚洲h在线观看| av一区二区三区四区| 精品日韩在线观看| 亚洲va在线va天堂| 91麻豆免费视频| 国产午夜精品久久久久久免费视 | 国产精品久久777777| 蜜臀av一区二区三区| 色94色欧美sute亚洲线路一久| 久久综合九色综合97_久久久| 一个色综合av| 波多野结衣精品在线| 欧美www视频| 午夜精品久久久久久久| 色综合久久六月婷婷中文字幕| 久久久精品免费观看| 九九视频精品免费| 日韩一二三区视频| 亚洲不卡av一区二区三区| 日本韩国精品在线| 亚洲欧美日韩中文播放| 99久久99久久久精品齐齐| 国产亚洲视频系列| 麻豆一区二区99久久久久| 欧美日韩你懂得| 亚洲国产欧美日韩另类综合 | 国产91精品久久久久久久网曝门| 欧美丰满高潮xxxx喷水动漫| 亚洲一区在线视频观看| 91免费看`日韩一区二区| 国产欧美一区二区精品性| 国产不卡高清在线观看视频| 国产欧美日韩另类视频免费观看|