Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9461358
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 21:54:39

串口类库的第二个版本

作者:



  上一回我发表第一版本的,收到了不少来信 ,提了不少意见和问题。我前一段时间又对这段代码作了修正,改动较大,主要思路没变,但更加规范并修改了几个错误。这次代码是完全按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;

	}

  这个版本相信足够用的, 我单位的在用串口加起来有四五十个,都没问题,还有问题欢迎来信批评指教。
阅读(393) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~