串口类库的第二个版本

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

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

本文配套源码

时间: 2024-11-08 17:27:24

串口类库的第二个版本的相关文章

封装较完整的串口类库

串口在工业应用是极为普遍的,我用API封装了同步和异步的串口类,以及一个具有监视线程的异步串口类:使用简单高效,具有工业强度,我在BC, BCB, VC, BCBX, GCC下编译通过,相信足够应付大多数情况,而且还可以继承扩展,下面简单介绍使用方法: 库的层次结构: _base_com:虚基类,基本接口,可自行扩展自己的串口类: _sync_com:_base_com 的子类, 同步应用,适合简单应用: _asyn_com:_base_com 的子类, 异步应用(重叠I/O),适合较高效应用,

Hunt the Wumpus第二个版本---多怪兽,多洞穴,洞穴间双向互通

其中,将洞穴连起来的算法要好好体会. 学习构建临时变量列表,确认循环用FOR,非确定循环用 WHILE,并定好退出条件. from random import choice cave_numbers = range(0,20) caves = [] for i in cave_numbers: caves.append([]) #保证所有洞穴双向连通 unvisited_caves = range(0,20) visited_caves = [0] unvisited_caves.remove(

MS SQL 事物日志传送能否跨数据库版本吗?

    SQL SERVER的事物日志传送(log shipping)功能,相信很多人都使用过或正在应用,这是MS SQL提供的一个非常强大的功能,一般需要一个主数据库服务器(primary/production database server)和辅助数据库服务器(standby server)来完成这个配置,默认情况下,主数据库和辅助数据库的版本应该是一致的,那么如果这两个数据库版本不一致,会不会有什么问题?还能做log shipping配置吗? 那么数据库版本不一致分两种情况:     1:

串口通信-Java使用rxtx进行多串口开发问题

问题描述 Java使用rxtx进行多串口开发问题 # 我的项目第一版中使用RXTX库进行串口操作(同一时间只涉及单个串口在工作),都没出现过问题. # 现在项目需要,接入多个串口同时工作,出现了JVM Crash的问题. 现象描述: 程序使用rxtx.jar进行串口通信开发,同时进程多个串口双向通信, 假设使用到的串口名称为COM1和COM2 情况1: com1开启,com2开启-->OK com1关闭-->OK com1第二次开启----->奔溃,提示见附1 情况2: com1开启,c

window php5.3.0版本怎么使用dio?

问题描述 window php5.3.0版本怎么使用dio? 需要读取rs232串口的数据,php版本5.3.0,不知道如何读取数据?求帮忙 解决方案 http://zhidao.baidu.com/link?url=5JeSlVaJfc8Q_hdxWdDWfLJCfzikza4_f9JoQS7bO4Yy8OhfUWKEqbV1zhcMSDYHYnPj99FQsIEJkdfq5t4D9K

Big Faceless PDF Library 2.11.21发布 PDF文档创建的Java类库

Big Faceless PDF Library是一个用于创建http://www.aliyun.com/zixun/aggregation/16864.html">PDF文档的Java类库.当前扩展版本提供了创建和编辑AcroForms,PDF格式转换到HTML表单的功能,PDF导入阅读和编辑,支持FDF,数字签名和验证文本提取.PDF表单包含文本框.单选按钮和 JavaScript 函数调用.它提供了完整的Unicode支持.加密.嵌入的TrueType和Type1字体.条形码.超链接

AS2与AS3版本的Flash全屏控制

 如何实现Flash Player 9 Update 2的全屏控制,我将给出2个版本,第一个版本是AS2的,第二个版本是AS3的,有趣的是,很多会写AS2的朋友,都很难写出AS3版本的,可能还是很难适应语法上和制作方式上的改变. AS2版本全屏播放控制: 场景中按钮上AS部分: on(press){   toggleFullScreen(); } 时间轴第一帧AS: //Button on Press触发toggleFullScreen函数 function toggleFullScreen()

许继电气资产注入藏谜团06年财务数据三个不同版本

每经记者 李智 酝酿了一个月,许继电气(000400,收盘价20.11元)价值18亿元注入大股东许继集团资产的重组方案终于破茧而出.昨日复牌后,许继电气的重组方案受到了市场热烈追捧,走出了"一"字型 涨停,全天成交仅58.51万股,换手率0.22%,显示出卖方的惜售心理.可是在这份被市场寄予厚望的重组方案背后,<每日经济新闻>记者却发现许继集团在其公开披露的财务数据上存在着多个"天差地别"的版本,而这也为此次集团注入上市公司的资产质量披上了重重迷雾. 注

c#串口调用,无法接收数据,串口为USB虚拟的

问题描述 c#调用.net的SerialPort串口类库,串口是USB虚拟的,可以打开串口,但无法接收串口数据.VC++调用一切正常.不知是什么原因,请大侠们指点://this.serialPort=newSerialPort();//this.serialPort.BaudRate=9600;//this.serialPort.PortName="COM3";//this.serialPort.DataBits=8;//this.serialPort.Parity=Parity.No