串口类库的第二个版本

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

串口类库的第二个版本

作者: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

这个版本相信足够用的, 我单位的在用串口加起来有四五十个,都没问题,还有问题欢迎来信批评指教。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航