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

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

?? rs232.cpp

?? 一個用c++編的串口通訊程序
?? CPP
字號:
////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232                                                                 ////
////                                                                        ////
////  Author: MonkeyKing     Aug 31th, 2003                                 ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////



#include <windows.h>

class RS232 {
public:

   RS232( void );
	RS232( LPCSTR lpszPortNum );
	~RS232();
   // For more definitions see <winbase.h>
	int open( LPCSTR lpszPortNum = "com1",    // 串口號
		       DWORD  dwBaudRate  = CBR_9600,  // 波特率
			    BYTE   byParity    = NOPARITY,  // 奇偶校驗
			    BYTE   byStopBits  = ONESTOPBIT,// 停止位個數
			    BYTE   byByteSize  = 8 );       // 字節長度
	DWORD	output( LPCVOID pdata, DWORD len );
	DWORD	input( LPVOID  pdest, DWORD len, DWORD dwMaxWait = 500 );
	LPSTR	GetErrorMessage( void );
   void close();

private:

	VOID	ErrorToString( LPCSTR lpszMessage );
	BOOL	IsNT( void );
	TCHAR       m_lpszErrorMessage[256];
	HANDLE      m_hCom;   // 串口句柄
	OVERLAPPED  m_ov;     // 包含異步輸入輸出操作信息的結構
};



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::RS232()                                                        ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

RS232::RS232( void )
{
	m_hCom = 0;
	m_lpszErrorMessage[0] = '\0';
	ZeroMemory(&m_ov, sizeof(m_ov));
}

RS232::RS232( LPCSTR lpszPortNum )
{ 
	RS232::RS232();
	RS232::open( lpszPortNum ); 
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::~RS232()                                                       ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

RS232::~RS232() {
   close();
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::GetErrorMessage                                                ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

LPSTR	RS232::GetErrorMessage( void ) {
   return m_lpszErrorMessage;
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::open( )                                                        ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

int RS232::open( LPCSTR lpszPortNum, 
                 DWORD  dwBaudRate, 
                 BYTE   byParity,
                 BYTE   byStopBits,
				     BYTE   byByteSize ) {
	DCB  dcb;   //串口設備控制塊 Device Control Block
	BOOL bSuccess;

   // m_hCom即為函數返回的串口的句柄
	m_hCom = CreateFile( lpszPortNum,           // pointer to name of the file
	                     GENERIC_READ|GENERIC_WRITE, // 允許讀寫。
	                     0,                     // 通訊設備必須以獨占方式打開。
	                     NULL,                  // 無安全屬性,表示該串口不可
                                               // 被子程序繼承。
	                     OPEN_EXISTING,         // 通訊設備已存在。
	                     FILE_FLAG_OVERLAPPED,  // 使用異步方式 overlapped I/O。
	                     NULL);                 // 通訊設備不能用模板打開。
	if ( m_hCom == INVALID_HANDLE_VALUE ) {
	   RS232::ErrorToString("RS232::open()   CreateFile() failed, invalid handle value");
		return FALSE;
	}

   // 與串口相關的參數非常多,當需要設置串口參數時,通常是先取得串口
   // 的參數結構,修改部分參數后再將參數結構寫入
	bSuccess = GetCommState(m_hCom, &dcb);
	if ( !bSuccess ) {
		RS232::close();
		RS232::ErrorToString("RS232::open()   GetCommState() failed");
		return FALSE;
	}
	dcb.BaudRate = dwBaudRate;   // 串口波特率。
	dcb.Parity   = byParity;     // 校驗方式,值0~4分別對應無校驗、奇
                                // 校驗、偶校驗、校驗、置位、校驗清零。 
   dcb.fParity = 0;             // 為1的話激活奇偶校驗檢查。
	dcb.ByteSize = byByteSize;   // 一個字節的數據位個數,范圍是5~8。
	dcb.StopBits = byStopBits;   // 停止位個數,0~2分別對應1位、1.5位、
                                // 2位停止位。
	if ( !bSuccess ) {
		RS232::close();
		RS232::ErrorToString("RS232::open()   SetCommState() failed");
		return FALSE;
	}

	return TRUE;
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::output()                                                       ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

DWORD RS232::output( LPCVOID pdata, DWORD   len ) {
	BOOL  bSuccess;
	DWORD written = 0;

	if ( len < 1 )
		return 0;
	// create event for overlapped I/O
	m_ov.hEvent = CreateEvent( NULL,   // pointer to security attributes 
	                           FALSE,  // flag for manual-reset event 
	                           FALSE,  // flag for initial state 
	                           "");    // pointer to event-object name 
	if ( m_ov.hEvent == INVALID_HANDLE_VALUE ) {
		RS232::ErrorToString( "RS232::output()   CreateEvent() failed" );
		return -1;
   }
	bSuccess = WriteFile( m_hCom,   // handle to file to write to  
	                      pdata,    // pointer to data to write to file 
	                      len,      // number of bytes to write 
	                      &written, // pointer to number of bytes written 
	                      &m_ov );  // pointer to structure needed for overlapped I/O
   // 如果函數執行成功的話檢查written的值為寫入的字節數,WriteFile函數執行完畢后 
   // 自行填充的,利用此變量的填充值可以用來檢查該函數是否將所有的數據成功寫入串口
	if ( RS232::IsNT() ) {
		bSuccess = GetOverlappedResult( m_hCom, &m_ov, &written, TRUE );
		if ( !bSuccess ) {
			CloseHandle( m_ov.hEvent );
			RS232::ErrorToString( "RS232::output()   GetOverlappedResult() failed" );
			return -1;
		}
	}
	else if ( len != written ) {
		CloseHandle( m_ov.hEvent );
		RS232::ErrorToString( "RS232::output()   WriteFile() failed" );
		return -1;
	}
	CloseHandle( m_ov.hEvent );
	return written;
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::input()                                                        ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

DWORD RS232::input( LPVOID pdest, DWORD  len, DWORD  dwMaxWait ) {
   BOOL  bSuccess;
	DWORD result = 0,
	      read   = 0, // num read bytes
	      mask   = 0; // a 32-bit variable that receives a mask 
	                  // indicating the type of event that occurred
	if ( len < 1 )
      return(0);
   // create event for overlapped I/O
	m_ov.hEvent = CreateEvent( NULL,    // pointer to security attributes 
	                           FALSE,   // flag for manual-reset event 
	                           FALSE,   // flag for initial state 
	                           "" );    // pointer to event-object name 
	if ( m_ov.hEvent == INVALID_HANDLE_VALUE ) {
		RS232::ErrorToString( "RS232::input()   CreateEvent() failed" );
		return -1;
	}
   // Specify here the event to be enabled
	bSuccess = SetCommMask( m_hCom, EV_RXCHAR );
	if ( ! bSuccess ) {
		CloseHandle(m_ov.hEvent);
		RS232::ErrorToString("RS232::input()   SetCommMask() failed");
		return -1;
	}
   // WaitForSingleObject
	bSuccess = WaitCommEvent(m_hCom, &mask, &m_ov);
	if ( !bSuccess ) {
      int err = GetLastError();
		if ( err == ERROR_IO_PENDING ) {
		   result = WaitForSingleObject(m_ov.hEvent, dwMaxWait);  //wait dwMaxWait
		                                        // milli seconds before returning
			if ( result == WAIT_FAILED ) {
				CloseHandle(m_ov.hEvent);
				RS232::ErrorToString( "RS232::input()   WaitForSingleObject() failed" );
	      	return -1;
			}
		}
	}
	// The specified event occured?
   if ( mask & EV_RXCHAR ) 
	{
		bSuccess = ReadFile( m_hCom, // handle of file to read 
			               pdest,  // address of buffer that receives data 
				            len,    // number of bytes to read 
					         &read,  // address of number of bytes read 
						      &m_ov); // address of structure for data 
		if ( RS232::IsNT() ) {
		   bSuccess = GetOverlappedResult(m_hCom, &m_ov, &read, TRUE);
         if ( !bSuccess ) {
				CloseHandle( m_ov.hEvent );
				RS232::ErrorToString( "RS232::input()   GetOverlappedResult() failed" );
	      	return -1;
	 		}
		}
		else if ( !bSuccess ) {
         CloseHandle(m_ov.hEvent);
			RS232::ErrorToString( "RS232::input()   ReadFile() failed" );
         return -1;
		}
	}
	else {
		CloseHandle(m_ov.hEvent);
		wsprintf( m_lpszErrorMessage, "RS232::input()   No EV_RXCHAR occured\n" );
      return -1;
	}
	CloseHandle(m_ov.hEvent);
	return read;
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::Close()                                                        ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

void RS232::close( void ) {
   if ( m_hCom > 0 )
	   CloseHandle( m_hCom );
   m_hCom = 0; 
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::IsNT                                                           ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

VOID RS232::ErrorToString( LPCSTR lpszMessage ) {
	LPVOID lpMessageBuffer;
	DWORD  error = GetLastError();

	FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
	               FORMAT_MESSAGE_FROM_SYSTEM,      // source and processing options
	               NULL,                            // pointer to message source
	               error,                           // requested message identifie
	               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // the user default language.
	               ( LPTSTR ) &lpMessageBuffer,     // pointer to message buffer
	               0,                               // maximum size of message buffer
	               NULL);                           // address of array of message inserts 

	// and copy it in our error string
	wsprintf(m_lpszErrorMessage,"%s: (%d) %s\n", lpszMessage, error, lpMessageBuffer);

	LocalFree(lpMessageBuffer);
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  RS232::IsNT                                                           ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

BOOL RS232::IsNT( void ) {
   OSVERSIONINFO osvi;
    
   osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
   GetVersionEx( &osvi );
   if ( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT )
      return TRUE;
   else
      return FALSE;
}



////////////////////////////////////////////////////////////////////////////////
////                                                                        ////
////  The End of RS232                                                      ////
////                                                                        ////
////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一卡在线观看| 亚洲一区二区三区四区在线观看 | 另类综合日韩欧美亚洲| 国产一区二区三区久久久| 91蜜桃婷婷狠狠久久综合9色| 精品国产在天天线2019| 亚洲精品乱码久久久久| 国产酒店精品激情| 在线综合+亚洲+欧美中文字幕| 国产精品妹子av| 九九精品一区二区| 欧美日本在线看| 一区二区三区中文在线| 国产suv一区二区三区88区| 在线电影国产精品| 一区二区三区四区中文字幕| 成人黄色小视频| 欧美高清一级片在线观看| 国产最新精品免费| 欧美成人一区二区三区| 日韩电影免费在线| 欧美性大战久久久久久久| 国产精品网站一区| 国产一区二区不卡在线| 欧美成人精品福利| 美女免费视频一区| 91精品国产综合久久精品图片 | 欧美伊人久久大香线蕉综合69 | 亚洲欧洲日韩av| 成人av电影在线观看| 国产无一区二区| 成人永久免费视频| 国产视频视频一区| 成人午夜视频在线观看| 亚洲国产高清不卡| 成人动漫av在线| 国产精品乱码一区二区三区软件 | 欧美三级视频在线| 一区二区三区加勒比av| 91黄视频在线观看| 午夜视频久久久久久| 7799精品视频| 免费在线观看视频一区| 日韩欧美国产综合一区| 久久av资源网| 久久久久9999亚洲精品| 成av人片一区二区| 亚洲精品美国一| 欧美精品丝袜中出| 激情综合网av| 国产欧美日韩精品在线| kk眼镜猥琐国模调教系列一区二区| 亚洲欧美中日韩| 欧美日韩国产中文| 激情成人综合网| 国产精品久久久久久久久免费桃花 | 激情综合一区二区三区| 国产视频亚洲色图| 欧美性猛交xxxx乱大交退制版 | 在线电影一区二区三区| 韩国午夜理伦三级不卡影院| 国产婷婷色一区二区三区在线| www.欧美色图| 午夜精品福利一区二区蜜股av | 国产亚洲女人久久久久毛片| 91小视频免费观看| 日韩电影在线免费观看| 久久精品一区二区三区不卡 | 夜夜嗨av一区二区三区网页| 欧美二区乱c少妇| 国产乱码精品一区二区三区五月婷 | 91美女片黄在线观看91美女| 日韩精品视频网站| 国产亲近乱来精品视频| 在线观看成人免费视频| 狠狠狠色丁香婷婷综合久久五月| 国产精品成人免费| 日韩欧美成人一区| 色噜噜狠狠成人中文综合 | 亚洲va天堂va国产va久| 久久久一区二区三区| 欧美日韩在线精品一区二区三区激情 | 亚洲午夜在线电影| 久久精品免视看| 欧美日韩一区二区不卡| 成人黄色软件下载| 麻豆91在线播放免费| 亚洲午夜视频在线| 亚洲欧美日韩一区二区| 久久综合给合久久狠狠狠97色69| 欧美三级三级三级爽爽爽| 91丨porny丨蝌蚪视频| 国产精品影音先锋| 久久精品国产99国产| 亚洲成人先锋电影| 尤物av一区二区| 最好看的中文字幕久久| 国产午夜精品福利| 亚洲精品在线观看视频| 日韩欧美一级片| 91精品国产高清一区二区三区蜜臀| 色综合欧美在线| eeuss影院一区二区三区| 国产91在线|亚洲| 国产呦萝稀缺另类资源| 蜜桃av一区二区在线观看 | 日韩免费看的电影| 欧美精品1区2区| 欧美日韩你懂的| 欧美日韩国产成人在线免费| 欧美亚日韩国产aⅴ精品中极品| 一本大道综合伊人精品热热| 在线亚洲免费视频| av在线免费不卡| 一本久久精品一区二区| 色综合久久中文字幕综合网| 色综合天天狠狠| 91蝌蚪porny九色| 在线这里只有精品| 欧美三级一区二区| 91精品国产欧美一区二区| 在线播放日韩导航| 欧美一区二区高清| wwww国产精品欧美| 国产色一区二区| 国产精品国产三级国产有无不卡| 中文欧美字幕免费| 最新不卡av在线| 亚洲一区二区三区在线播放| 日韩在线一二三区| 久久99精品国产91久久来源| 成人综合婷婷国产精品久久免费| 91在线视频播放地址| 欧美丝袜自拍制服另类| 欧美一卡二卡三卡| 欧美精品一区二区三区高清aⅴ | 午夜久久电影网| 欧美aⅴ一区二区三区视频| 久久国产精品99久久久久久老狼 | 欧美在线观看你懂的| 欧美精品aⅴ在线视频| 欧美成人a在线| 国产精品久久久久婷婷二区次| 亚洲精品视频自拍| 天天影视涩香欲综合网| 国产在线播精品第三| 日本高清不卡aⅴ免费网站| 欧美老肥妇做.爰bbww| 国产亚洲综合色| 亚洲图片欧美色图| 久久福利视频一区二区| 成人综合婷婷国产精品久久蜜臀 | 久色婷婷小香蕉久久| av中文字幕不卡| 欧美一区二区三区婷婷月色| 中文字幕精品—区二区四季| 六月丁香婷婷色狠狠久久| 一本色道**综合亚洲精品蜜桃冫| 日韩欧美中文一区二区| 亚洲欧美自拍偷拍| 老司机午夜精品| 在线国产亚洲欧美| 久久久久久一级片| 一区二区三区在线视频免费 | 2023国产精品视频| 亚洲精品福利视频网站| 国产一区二区三区精品欧美日韩一区二区三区 | 一区二区免费看| 国产毛片精品国产一区二区三区| 欧美日韩高清一区| 国产精品久久久一区麻豆最新章节| 麻豆一区二区三区| 欧美色中文字幕| 亚洲天天做日日做天天谢日日欢| 韩国午夜理伦三级不卡影院| 欧美福利视频一区| 亚洲欧美色综合| aaa欧美色吧激情视频| 久久伊人蜜桃av一区二区| 日韩高清一区二区| 欧美在线小视频| 亚洲免费观看高清完整| 成人午夜激情在线| 久久精品在线观看| 国产一区二区三区四区在线观看| 欧美一区二视频| 日韩精品国产精品| 欧美色图在线观看| 一卡二卡三卡日韩欧美| 99这里都是精品| 国产精品久久精品日日| 国产91在线观看丝袜| 久久女同互慰一区二区三区| 久久99精品久久久久婷婷| 欧美v日韩v国产v| 麻豆国产欧美日韩综合精品二区| 日韩欧美综合在线| 久久99这里只有精品| 欧美精品一区二| 国产伦精品一区二区三区在线观看|