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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? com_class.h

?? 一個很好用的串口類
?? H
字號:
/*
串口基礎(chǔ)類庫(WIN32)	ver 0.1

編譯器 : BC++ 5; C++ BUILDER 4, 5, 6, X; VC++ 5, 6; VC.NET;  GCC;

class   _base_com : 虛基類 基本串口接口;
class   _aync_com : 同步I/O 串口類;
class   _sync_com : 異步I/O 串口類;
class _thread_com :	異步I/O 輔助讀監(jiān)視線程 可轉(zhuǎn)發(fā)窗口消息 串口類(可繼承虛函數(shù)on_receive用于讀操作);

copyright(c) 2004.8 llbird wushaojian@21cn.com
*/

#ifndef	_COM_CLASS_H_
#define _COM_CLASS_H_

#pragma warning(disable: 4530)
#pragma warning(disable: 4786)
#pragma warning(disable: 4800)

#include <cassert>
#include <strstream>
#include <algorithm>
#include <exception>
#include <iomanip>
using namespace std;

#include <windows.h>

class _base_com	  //虛基類 基本串口接口
{
protected:

	volatile int _port;	 //串口號
	volatile HANDLE _com_handle;//串口句柄
	DCB _dcb;			  //波特率,停止位,等
	int _in_buf, _out_buf; // 緩沖區(qū)
	COMMTIMEOUTS _co;	 //	超時時間
	//虛函數(shù),用于不同方式的串口打開
	virtual bool open_port() = 0;

	void init()	//初始化
	{
		memset(&_dcb, 0, sizeof(_dcb));
		_dcb.DCBlength = sizeof(_dcb);

		_com_handle = INVALID_HANDLE_VALUE;

		_in_buf = _out_buf = 8192;

		memset(&_co, 0, sizeof(_co));
		_co.ReadIntervalTimeout = 0xFFFFFFFF;
		_co.ReadTotalTimeoutMultiplier = 0;
		_co.ReadTotalTimeoutConstant = 0;
		_co.WriteTotalTimeoutMultiplier = 0;
		_co.WriteTotalTimeoutConstant = 5000;
	}

public:
	_base_com()
	{
		init();	
	}
	virtual ~_base_com()
	{
		close();				  
	}
	/*基本參數(shù)設(shè)置*/
	//設(shè)置串口參數(shù):波特率,停止位,等
	inline bool set_para() 
	{
		return is_open() ? SetCommState(_com_handle, &_dcb) : false;
	}
	//打開設(shè)置對話框
	bool config_dialog()  
	{
		if(is_open())
		{
			COMMCONFIG cf;
			memset(&cf, 0, sizeof(cf));
			cf.dwSize = sizeof(cf);
			cf.wVersion = 1;

			char com_str[10];
			strcpy(com_str, "COM");
			ltoa(_port, com_str + 3, 10);

			if(CommConfigDialog(com_str, NULL, &cf))
			{
				 memcpy(&_dcb, &cf.dcb, sizeof(DCB));
				 return SetCommState(_com_handle, &_dcb);
			}
		}
		return false;
	}
	//支持設(shè)置字符串 "9600, 8, n, 1"
	bool set_dcb(char *set_str)	
	{
		return bool(BuildCommDCB(set_str, &_dcb));
	}
	//設(shè)置內(nèi)置結(jié)構(gòu)串口參數(shù):波特率,停止位
	bool set_dcb(int BaudRate, int ByteSize = 8, int Parity = NOPARITY, int StopBits = ONESTOPBIT)
	{
		_dcb.BaudRate = BaudRate;
	    _dcb.ByteSize = ByteSize;
	    _dcb.Parity   = Parity;
	    _dcb.StopBits = StopBits;
		return true;
	}
	//設(shè)置緩沖區(qū)大小
	inline bool set_buf(int in_buf, int out_buf)
	{
		return is_open() ? SetupComm(_com_handle, in_buf, out_buf) : false;
	}
	//打開串口 缺省 9600, 8, n, 1
	inline bool open(int port)
	{
		if(port < 1 || port > 1024)
			return false;

		set_dcb(9600);
		_port = port;

		return open_port();
	}
	//打開串口 缺省 baud_rate, 8, n, 1
	inline bool open(int port, int baud_rate)
	{
		if(port < 1 || port > 1024)
			return false;

		set_dcb(baud_rate);
		_port = port;

		return open_port();
	}
	//打開串口
	inline bool open(int port, char *set_str)
	{
		if(port < 1 || port > 1024)
			return false;

		if(!BuildCommDCB(set_str, &_dcb))
			return false;

		_port = port;

		return open_port();
	}
	//關(guān)閉串口
	inline virtual void close()
	{
		if(is_open())		
		{
			CloseHandle(_com_handle);
			_com_handle = INVALID_HANDLE_VALUE;
		}
	}
	//判斷串口是或打開
	inline bool is_open()
	{
		return _com_handle != INVALID_HANDLE_VALUE;
	}
	//獲得串口句炳
	HANDLE get_handle()
	{
		return _com_handle;
	}
};

class _sync_com	: public _base_com
{
protected:
	//打開串口
	virtual bool open_port()
	{
		if(is_open())
			close();

		char com_str[10];
		
		strcpy(com_str, "COM");
		ltoa(_port, com_str + 3, 10);
		_com_handle = CreateFile(
			com_str,
			GENERIC_READ | GENERIC_WRITE,
			0,
			NULL,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL ,	
			NULL
			);
		assert(is_open());
		if(!is_open())//檢測串口是否成功打開
			return false;
		
		BOOL ret; 
		ret = SetupComm(_com_handle, _in_buf, _out_buf);	//設(shè)置推薦緩沖區(qū)
		assert(ret);
		ret &= SetCommState(_com_handle, &_dcb);	//設(shè)置串口參數(shù):波特率,停止位,等
		assert(ret);
		ret &= SetCommTimeouts(_com_handle, &_co);	//設(shè)置超時時間
		assert(ret);
		ret &= PurgeComm(_com_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );	//清空串口緩沖區(qū)
		assert(ret);
		if(!ret)
		{
			close();
			return false;
		}

		return true;
	}

public:

	_sync_com()
	{
		_co.ReadTotalTimeoutConstant = 5000;
	}
	//同步讀
	int read(char *buf, int buf_len)
	{
		if(!is_open())
			return 0;

		buf[0] = '\0';
		
		COMSTAT  stat;
		DWORD error;

		if(ClearCommError(_com_handle, &error, &stat) && error > 0)	//清除錯誤
		{
			PurgeComm(_com_handle, PURGE_RXABORT | PURGE_RXCLEAR); /*清除輸入緩沖區(qū)*/
			return 0;
		}
		 
		unsigned long r_len = 0;

		buf_len = min(buf_len - 1, (int)stat.cbInQue);
		if(!ReadFile(_com_handle, buf, buf_len, &r_len, NULL))
				r_len = 0;
		buf[r_len] = '\0';

		return r_len;
	}
	//同步寫
	int write(char *buf, int buf_len)
	{
		if(!is_open() || !buf)
			return 0;
		
		DWORD    error;
		if(ClearCommError(_com_handle, &error, NULL) && error > 0)	//清除錯誤
			PurgeComm(_com_handle, PURGE_TXABORT | PURGE_TXCLEAR);

		unsigned long w_len = 0;
		if(!WriteFile(_com_handle, buf, buf_len, &w_len, NULL))
			w_len = 0;

		return w_len;
	}
	//同步寫
	inline int write(char *buf)
	{
		assert(buf);
		return write(buf, strlen(buf));
	}
	//同步寫, 支持部分類型的流輸出
	template<typename T>
	_sync_com& operator << (T x)
	{
		strstream s;

		s << x;
		write(s.str(), s.pcount());

		return *this;
	}
};

class _asyn_com	: public _base_com
{
protected:

	OVERLAPPED _ro, _wo; //	重疊I/O

	virtual bool open_port()
	{
		if(is_open())
			close();

		char com_str[10];

		strcpy(com_str, "COM");
		ltoa(_port, com_str + 3, 10);
		_com_handle = CreateFile(
			com_str,
			GENERIC_READ | GENERIC_WRITE,
			0,
			NULL,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,	//重疊I/O
			NULL
			);
		assert(is_open());
		if(!is_open())//檢測串口是否成功打開
			return false;
		
		BOOL ret; 
		ret = SetupComm(_com_handle, _in_buf, _out_buf);	//設(shè)置推薦緩沖區(qū)
		assert(ret);
		ret = SetCommState(_com_handle, &_dcb);	//設(shè)置串口參數(shù):波特率,停止位,等
		assert(ret);
		ret = SetCommTimeouts(_com_handle, &_co);	//設(shè)置超時時間
		assert(ret);
		ret = PurgeComm(_com_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );	//清空串口緩沖區(qū)
		assert(ret);

		return true;
	}

public:

	_asyn_com()
	{
		memset(&_ro, 0, sizeof(_ro));
		memset(&_wo, 0, sizeof(_wo));

		_ro.hEvent = CreateEvent(NULL, true, false, NULL);
		assert(_ro.hEvent != INVALID_HANDLE_VALUE); 
		
		_wo.hEvent = CreateEvent(NULL, true, false, NULL);
		assert(_wo.hEvent != INVALID_HANDLE_VALUE);	
	}
	virtual ~_asyn_com()
	{
		close();

		if(_ro.hEvent != INVALID_HANDLE_VALUE)
			CloseHandle(_ro.hEvent);

		if(_wo.hEvent != INVALID_HANDLE_VALUE)
			CloseHandle(_wo.hEvent);
	}
	//異步讀
	int read(char *buf, int buf_len)
	{
		if(!is_open())
			return 0;

		buf[0] = '\0';

		COMSTAT  stat;
		DWORD error;

		if(ClearCommError(_com_handle, &error, &stat) && error > 0)	//清除錯誤
		{
			PurgeComm(_com_handle, PURGE_RXABORT | PURGE_RXCLEAR); /*清除輸入緩沖區(qū)*/
			return 0;
		}

		if(!stat.cbInQue)// 緩沖區(qū)無數(shù)據(jù)
			return 0;

		unsigned long r_len = 0;

		buf_len = min((int)(buf_len - 1), (int)stat.cbInQue);

		if(!ReadFile(_com_handle, buf, buf_len, &r_len, &_ro)) //2000 下 ReadFile 始終返回 True
		{
			if(GetLastError() == ERROR_IO_PENDING) // 結(jié)束異步I/O
			{
				if(!GetOverlappedResult(_com_handle, &_ro, &r_len, false))
				{
					if(GetLastError() != ERROR_IO_INCOMPLETE)//其他錯誤
							r_len = 0;
				}
			}
			else
				r_len = 0;
		}
			
		buf[r_len] = '\0';
		return r_len;
	}
	//異步寫
	int write(char *buf, int buf_len)
	{
		if(!is_open())
			return 0;

		assert(buf);

		DWORD    error;
		if(ClearCommError(_com_handle, &error, NULL) && error > 0)	//清除錯誤
			PurgeComm(_com_handle, PURGE_TXABORT | PURGE_TXCLEAR);	

		unsigned long w_len = 0, o_len = 0;
		if(!WriteFile(_com_handle, buf, buf_len, &w_len, &_wo))
			if(GetLastError() != ERROR_IO_PENDING)
				w_len = 0;

		return w_len;
	}
	//異步寫
	inline int write(char *buf)
	{
		assert(buf);
		return write(buf, strlen(buf));
	}
	//異步寫, 支持部分類型的流輸出
	template<typename T>
	_asyn_com& operator << (T x)
	{
		strstream s;

		s << x ;
		write(s.str(), s.pcount());

		return *this;
	}
};

//當(dāng)接受到數(shù)據(jù)送到窗口的消息
#define ON_COM_RECEIVE WM_USER + 618	 //	 WPARAM 端口號

class _thread_com : public _asyn_com
{
protected:
	volatile HANDLE _thread_handle;	//輔助線程
	volatile HWND _notify_hwnd; // 通知窗口
	volatile long _notify_num;//接受多少字節(jié)(>_notify_num)發(fā)送通知消息
	volatile bool _run_flag; //線程運行循環(huán)標志

	OVERLAPPED _wait_o; //WaitCommEvent use

	//線程收到消息自動調(diào)用, 如窗口句柄有效, 送出消息, 包含窗口編號
	virtual void on_receive()
	{
		if(_notify_hwnd)
			PostMessage(_notify_hwnd, ON_COM_RECEIVE, WPARAM(_port), LPARAM(0));
	}
	//打開串口,同時打開監(jiān)視線程
	virtual bool open_port()
	{
		if(_asyn_com::open_port())
		{
			_run_flag = true; 
			DWORD id;
			_thread_handle = CreateThread(NULL, 0, com_thread, this, 0, &id); //輔助線程
			assert(_thread_handle);
			if(!_thread_handle)
			{
				CloseHandle(_com_handle);
				_com_handle = INVALID_HANDLE_VALUE;
			}
			else
				return true;
		}
		return false;
	}

public:
	_thread_com()
	{
		_notify_num = 0;
		_notify_hwnd = NULL;
		_thread_handle = NULL;

		memset(&_wait_o, 0, sizeof(_wait_o));
		_wait_o.hEvent = CreateEvent(NULL, true, false, NULL);
		assert(_wait_o.hEvent != INVALID_HANDLE_VALUE);	
	}
	~_thread_com()
	{
		close();

		if(_wait_o.hEvent != INVALID_HANDLE_VALUE)
			CloseHandle(_wait_o.hEvent);
	}
	//設(shè)定發(fā)送通知, 接受字符最小值	 默認 0
	void set_notify_num(int num)
	{
		_notify_num = num;
	}
	//送消息的窗口句柄
	inline void set_hwnd(HWND hWnd)
	{
		_notify_hwnd = hWnd;
	}
	//關(guān)閉線程及串口
	virtual void close()
	{
		if(is_open())		
		{
			_run_flag = false;
			SetCommMask(_com_handle, 0);
			ResetEvent(_wait_o.hEvent);

			if(WaitForSingleObject(_thread_handle, 100) != WAIT_OBJECT_0)
				TerminateThread(_thread_handle, 0);

			CloseHandle(_com_handle);
			CloseHandle(_thread_handle);

			_thread_handle = NULL;
			_com_handle = INVALID_HANDLE_VALUE;
		}
	}
	/*輔助線程控制*/
	//獲得線程句柄
	HANDLE get_thread()
	{
		return _thread_handle;
	}
	//暫停監(jiān)視線程
	bool suspend()
	{
		return _thread_handle != NULL ? SuspendThread(_thread_handle) != 0xFFFFFFFF : false;
	}
	//恢復(fù)監(jiān)視線程
	bool resume()
	{
		return _thread_handle != NULL ? ResumeThread(_thread_handle) != 0xFFFFFFFF : false;
	}

private:
	//監(jiān)視線程
	static DWORD WINAPI com_thread(LPVOID para)
	{
		_thread_com *pcom = (_thread_com *)para;	
		

        if(!SetCommMask(pcom->_com_handle, EV_RXCHAR | EV_ERR))
			return 0;

		COMSTAT  stat;
		DWORD error;

		for(DWORD length, mask = 0; pcom->_run_flag && pcom->is_open(); mask = 0)
		{
			if(!WaitCommEvent(pcom->_com_handle, &mask, &pcom->_wait_o))
			{
				if(GetLastError() == ERROR_IO_PENDING)
				{
					GetOverlappedResult(pcom->_com_handle, &pcom->_wait_o, &length, true);
				}
			}

			if(mask & EV_ERR) // == EV_ERR
				ClearCommError(pcom->_com_handle, &error, &stat);

			if(mask & EV_RXCHAR) // == EV_RXCHAR
			{
				ClearCommError(pcom->_com_handle, &error, &stat);
				if(stat.cbInQue > pcom->_notify_num)
					pcom->on_receive();
			}
        }

		return 0;
	}
	
};

#endif _COM_CLASS_H_

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人在线视频网站| 国产精品黄色在线观看| 99久久亚洲一区二区三区青草| 日本不卡的三区四区五区| 亚洲一区二区在线观看视频| 亚洲精品视频在线| 亚洲国产欧美一区二区三区丁香婷| 亚洲人成影院在线观看| 亚洲欧洲精品一区二区精品久久久| 国产精品午夜在线| 国产精品久久久久精k8| 亚洲女爱视频在线| 亚洲综合成人在线视频| 日韩在线观看一区二区| 久久99这里只有精品| 国产精品伊人色| 99久久99久久久精品齐齐| 在线亚洲一区二区| 欧美日韩亚洲丝袜制服| 日韩免费高清av| 国产精品五月天| 玉足女爽爽91| 琪琪一区二区三区| 国产另类ts人妖一区二区| 成人av电影在线网| 欧美日韩不卡视频| 久久综合九色综合久久久精品综合| 久久综合久久综合亚洲| 亚洲精品视频一区| 久久99蜜桃精品| 99精品热视频| 日韩你懂的在线观看| 欧美激情一区二区三区全黄| 亚洲一区二区在线免费观看视频| 精品在线播放免费| 色老头久久综合| 日韩欧美色电影| 亚洲素人一区二区| 精品在线观看视频| 欧美日产在线观看| 国产精品丝袜一区| 日韩精品免费专区| 色综合天天做天天爱| 日韩欧美国产三级| 一区二区三区精品在线| 国产美女娇喘av呻吟久久| 在线观看视频一区二区| 久久久久久久久免费| 香蕉加勒比综合久久| 成人app在线| 日韩一区二区三区电影 | 国产精品国产三级国产专播品爱网 | 国产成人精品一区二区三区四区| 日本黄色一区二区| 国产精品丝袜久久久久久app| 亚洲国产成人tv| 97国产精品videossex| 日韩亚洲电影在线| 午夜精品久久久久久不卡8050| youjizz国产精品| 2024国产精品| 另类欧美日韩国产在线| 欧美日韩dvd在线观看| 亚洲午夜久久久久| 色综合久久久网| 亚洲欧洲精品一区二区三区| 成人一区二区三区在线观看| 91精品国产综合久久久久久| 亚洲人成亚洲人成在线观看图片 | 国产精品免费网站在线观看| 精品一二线国产| 日韩欧美123| 日韩影院在线观看| 欧美日韩免费不卡视频一区二区三区| 亚洲婷婷综合久久一本伊一区| 国产传媒欧美日韩成人| 国产亚洲va综合人人澡精品| 国内精品免费在线观看| 26uuu久久综合| 国产一区二区三区免费看 | 久久久久久久久岛国免费| 美女性感视频久久| 亚洲精品在线网站| 国产精品一区二区91| 国产喷白浆一区二区三区| 国产精品香蕉一区二区三区| 欧美mv日韩mv国产| 国产麻豆午夜三级精品| 精品盗摄一区二区三区| 国产精品性做久久久久久| 中文av一区二区| 91成人免费电影| 毛片基地黄久久久久久天堂| 欧美xxxxx牲另类人与| 国产福利一区二区三区视频在线 | 国产精品久久久久久久久久久免费看 | 91丨porny丨国产| 有码一区二区三区| 欧美一级一级性生活免费录像| 蜜臂av日日欢夜夜爽一区| 精品动漫一区二区三区在线观看| 国产成a人无v码亚洲福利| 亚洲你懂的在线视频| 欧美一区二区三区免费大片| 国产精品18久久久久久久久 | 在线免费观看日本欧美| 日日夜夜免费精品| 国产欧美在线观看一区| 色综合久久中文综合久久牛| 欧美aaa在线| 国产精品久久久久一区二区三区共 | 99免费精品视频| 免费人成黄页网站在线一区二区| 久久久久久久久久久黄色| 日本久久一区二区| 国产真实精品久久二三区| 一区二区激情视频| 日韩欧美黄色影院| 在线观看国产91| 国产不卡免费视频| 麻豆国产精品一区二区三区 | 色系网站成人免费| 久热成人在线视频| 一区二区三区在线影院| 久久精品水蜜桃av综合天堂| 在线视频综合导航| 国产酒店精品激情| 日韩成人伦理电影在线观看| 欧美国产一区在线| 欧美一级爆毛片| 97久久精品人人做人人爽| 国产在线不卡一卡二卡三卡四卡| 亚洲国产精品视频| 亚洲色图制服诱惑 | 99久久精品国产网站| 国产综合色精品一区二区三区| 亚洲成在线观看| 亚洲男人天堂av| 亚洲色图欧洲色图| 国产精品剧情在线亚洲| 久久久久久久久久电影| 欧美xxx久久| 久久亚洲捆绑美女| 日韩午夜精品电影| 欧美一级夜夜爽| 欧美一区二区三区电影| 欧美精品123区| 欧美日韩在线一区二区| 91久久一区二区| 91国模大尺度私拍在线视频| 国产.欧美.日韩| 国产东北露脸精品视频| 国产成人日日夜夜| 国产成人久久精品77777最新版本| 奇米综合一区二区三区精品视频| 日本va欧美va精品发布| 日本伊人午夜精品| 久久er精品视频| 国产麻豆精品在线| 国产毛片一区二区| 国产91在线看| 成人精品亚洲人成在线| 91在线免费播放| 欧美专区日韩专区| 欧美二区乱c少妇| 日韩精品一区二区三区在线播放| 精品日韩一区二区| 国产人久久人人人人爽| 亚洲日本一区二区| 亚洲国产精品视频| 日本不卡一区二区三区| 奇米精品一区二区三区在线观看一| 免费人成网站在线观看欧美高清| 国内精品国产三级国产a久久| 国产精品一区二区在线播放| 成人精品国产一区二区4080| 91美女视频网站| 91精品国产色综合久久久蜜香臀| 精品国产三级电影在线观看| 国产精品少妇自拍| 亚洲午夜视频在线| 粗大黑人巨茎大战欧美成人| 91片黄在线观看| 精品少妇一区二区三区在线播放 | 日韩毛片精品高清免费| 亚洲综合视频在线| 久久精品99国产国产精| 99久久久久久| 欧美xxx久久| 亚洲欧洲中文日韩久久av乱码| 手机精品视频在线观看| 丁香五精品蜜臀久久久久99网站| 在线精品视频免费播放| 欧美一区二区三区影视| 国产精品人成在线观看免费 | 久久久久久免费网| 一区二区三区欧美日| 久久国产成人午夜av影院| 一本色道久久综合亚洲aⅴ蜜桃 | 丰满少妇在线播放bd日韩电影|