中国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

下载源代码

  上一回我发表第一版本的串口类库,收到了不少来信 ,提了不少意见和问题。我前一段时间又对这段代码作了修正,改动较大,主要思路没变,但更加规范并修改了几个错误。这次代码是完全按WIN32命名规范,适合用于VC++的开发,以前我一直用SDK,,用C风格的命名方式,将代码与VC程序整合看起来有点别扭,这次就不会了。

几个变动

  一个缺陷,前一段时间我在2000下用8串口卡发现第10个串口打不开,查了MSDN找到了原因,这里我做了修正。在NT/2000下 原来的代码打开编号10以上端口用 :

    CreateFile(
   "COM10",
   GENERIC_READ | GENERIC_WRITE,
   0,
   NULL,
   OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //重叠I/O
   NULL
   );   
将提示错误,这样就OK:
 CreateFile(
   "\\\\.\\COM10",//对应的就是\\.\COM10
   GENERIC_READ | GENERIC_WRITE,
   0,
   NULL,
   OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //重叠I/O
   NULL
   );
将阻塞与非阻塞的方式的代码作了整合,并可以选择是否开启监视线程:
	cnComm MyComm1(false, 0);// 第1个参数为是否启动监视线程(这里不用线程),
                                  //第2个参数为阻塞(0)/异步方式(默认)
	cnComm MyComm2;//默认启动监视线程, 异步
	cnComm MyComm3(true);//监视线程, 阻塞
   
这样读写代码就不会像原来那样重复;修正一个错误,原来我在关闭线程时用一下代码退出 WaitCommEvent 的等待:
  ::SetCommMask(_hCommHandle, 0);
  ::ResetEvent(_WaitOverlapped.hEvent);//这里有笔误,由于这两句的得作用
                                       //是一样(双保险退出WaitCommEvent),测试时没发现

修正为

::SetEvent(_WaitOverlapped.hEvent);

还有一些小的地方就不说了。

一个较完整的范例:

	#pragma warning(disable: 4530)
	#pragma warning(disable: 4786)
	#include "iostream"
	#include "exception"
	using namespace std;
	#include "cnComm.h"

	class MyComm : public cnComm
	{
	public:
		virtual void OnReceive()
		{
			char Buffer[256];
			if(Read(Buffer, 256))
			    cout << "Receive Data Form " << 
                                       _dwPort << " : " << Buffer << endl;
		}
	};

	int main(int argc, char *argv[])
	{
		try
		{
			//将COM1 COM2相连测试
			cnComm Com1(false, 0);//阻塞
			MyComm Com2;//继承扩展使用 非阻塞
			Com1.Open(1, 1200);
			Com2.Open(2, 1200);
			char Buffer[] = "test com";
			Com1.Write(Buffer);
			Sleep(300);
			Com1.Close();
		}
		catch(exception &e)
		{
			cout << e.what() << endl;
		}
		return 0;
	}
  这个版本相信足够用的, 我单位的在用串口加起来有四五十个,都没问题,还有问题欢迎来信批评指教。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有