中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 网络与通信
封装较完整的串口类库
作者:未知 时间:2005-07-20 14:18 出处:VC知识库 责编:chinaitpower
              摘要:封装较完整的串口类库

封装较完整的串口类库

llbird


下载源代码

   串口在工业应用是极为普遍的,我用API封装了同步和异步的串口类,以及一个具有监视线程的异步串口类;使用简单高效,具有工业强度,我在BC, BCB, VC, BCBX, GCC下编译通过,相信足够应付大多数情况,而且还可以继承扩展,下面简单介绍使用方法;

库的层次结构:

  •   _base_com:虚基类,基本接口,可自行扩展自己的串口类;
  •   _sync_com:_base_com 的子类, 同步应用,适合简单应用;
  •   _asyn_com:_base_com 的子类, 异步应用(重叠I/O),适合较高效应用,NT平台;
  • _thread_com:_asyn_com 的子类, 异步应用,具有监视线程,适合较复杂应用,窗口通知消息和继承扩展的使用方式;

一些应用范例 :

  当然首先 #include "com_class.h"

一、打开串口1同步写
	char str[] = "com_class test";
	_sync_com com1;	//同步
	com1.open(1); // 相当于 com1.open(1, 9600);  com1.open(1, "9600,8,n,1");
	for(int i=0; i<100; i++)
	{
		Sleep(500);
		com1.write(str); //也可以 com1.write(str, strlen(str));
	}
	com1.close();
      二、打开串口2异步读     
	char str[100];
	_asyn_com com2;	//异步
	com2.open(2); // 相当于 com2.open(2, 9600);  com2.open(2, "9600,8,n,1");
	if(!com2.is_open())
		cout << "COM2 not open , error : " << GetLastError() << endl;
	/* 也可以如下用法
		if(!com2.open(2))
			cout << "COM2 not open , error : " << GetLastError() << endl;
	*/
	for(int i=0; i<100; i++)
	{
		Sleep(500);
		if(com2.read(str, 100) > 0)//异步读,返回读取字符数
			cout << str; 
	}
	com2.close();
      三、扩展应用具有监视线程的串口类
	class _com_ex : public thread_com
	{
	public:
		virtual on_receive()
		{
			char str[100];
			if(read(str, 100) > 0)//异步读,返回读取字符数
					cout << str; 
		}
	};

	int main(int argc, char *argv[])
	{
		try
		{
			char str[100];
			_com_ex com2;	//异步扩展
			com2.open(2); 
			Sleep(10000);
			com2.close();
		}
		catch(exception &e)
		{
			cout << e.what() << endl;
		}
		return 0;
	}

四、桌面应用可发送消息到指定窗口(在C++ Builder 和 VC ++ 测试通过)

VC ++ 接受消息
	BEGIN_MESSAGE_MAP(ComDlg, CDialog)
		//{{AFX_MSG_MAP(ComDlg)
		ON_WM_SYSCOMMAND()
		ON_WM_PAINT()
		ON_WM_QUERYDRAGICON()
		ON_WM_DESTROY()
		//}}AFX_MSG_MAP
		ON_MESSAGE(ON_COM_RECEIVE, On_Receive)
	END_MESSAGE_MAP()
	 
   打开串口,传递窗口句柄   
	 _thread_com com2;
	 com2.open(2);
	 com2.set_hwnd(ComDlg->m_hWnd);
	
   处理消息   
	LRESULT ComDlg::On_Receive(WPARAM wp, LPARAM lp)
	{
		char str[100];
		com2.read(str, 100);

		char com_str[10];
		strcpy(com_str, "COM");
		ltoa((long)wp, com_str + 3, 10); //	WPARAM 保存端口号

		MessageBox(str, com_str, MB_OK);
		return 0;
	}
	

C++ Builder
	class TForm1 : public TForm
	{
	__published:	// IDE-managed Components
		void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
		void __fastcall FormCreate(TObject *Sender);
	private:	// User declarations
	public:		// User declarations
		void On_Receive(TMessage& Message);
		__fastcall TForm1(TComponent* Owner);
		_thread_com com2;
		BEGIN_MESSAGE_MAP
			MESSAGE_HANDLER(ON_COM_RECEIVE, TMessage, On_Receive)
		END_MESSAGE_MAP(TForm)
	};
	
	void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
	{
			com2.close();
	}
	//---------------------------------------------------------------------------
	void __fastcall TForm1::FormCreate(TObject *Sender)
	{
		   com2.open(2);
		   com2.set_hwnd(Handle);
	}
	//---------------------------------------------------------------------------
	void  TForm1::On_Receive(TMessage& Message)
	{
			char xx[20];
			int port = Message.WParam;
			if(com2.read(xx, 20) > 0)
					ShowMessage(xx);
	}
	 
   错误和缺陷在所难免,欢迎来信批评指正;

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有