你现在位置:首页>技术论文>软件知识>正文
一片文章,学习他的封装思想和运算符重载的想法!
日期:2008-4-16 0:17:49 来源:本站整理  
点击: 作者:
点击【】放大字体.
P.L.C.技.术.网——可编程控制器技术门户

串口在工业应用是极为普遍的,我用API封装了同步和异步的串口类,以及一个具有监视线程的异步串口类;使用简单高效,具有工业强度,我在BC, BCB, VC, BCBX, GCC下编译通过,相信足够应付大多数情况,而且还可以继承扩展,下面简单介绍使用方法, 后附源代码(_com.h);
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

        库的层次结构:
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

   _base_com:虚基类,基本接口,可自行扩展自己的串口类
plcjs.技.术_网

   _sync_com:_base_com 的子类, 同步应用,适合简单应用
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

   _asyn_com:_base_com 的子类, 异步应用(重叠I/O),适合较高效应用,NT平台
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

   _thread_com:_asyn_com 的子类, 异步应用,监视线程,适合较复杂应用,窗口通知消息和继承扩展的使用方式;
P.L.C.技.术.网——可编程控制器技术门户

   几个问题:
WWW.PLCJS.COM——可编程控制器技术门户

     结束线程
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    如何从WaitCommEvent(pcom->_com_handle, &mask, &pcom->_wait_o)这个API退出以便顺利结束线程:
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    方案1:
WWW_P※LCJS_COM-PLC-)技.术_网

     SetCommMask(_com_handle, 0);    这个方法在MSDN有载,当在一些情况下并不完全有效,原因未知;
WWW_PLC※JS_COM-PmLC-技.术_网

    方案2: 
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

     SetEvent(_wait_o.hEvent);    直接激活重叠IO结构中的事件句柄,绝对有效;  这份代码我两种都用;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    打开10以上的COM端口
WWW_PLCJS@_COM%-PLC-技.术_网

   在NT/2000下打开编号10以上端口用
WWW_P※LCJS_CO※M-PLC-技-.术_网

    _com_handle = CreateFile(
WWcW_PLCJS_COM-PLC-技.术_网

   “COM10“,
WWW_P※LCJS_CO※M-PLC-技-.术_网

   GENERIC_READ | GENERIC_WRITE,
W1WW_P4LCJS_COM-PLC-技.术_网

   0,
WWW_P※LCJS_COM-PLC-)技.术_网

   NULL,
plcjs.技.术_网

   OPEN_EXISTING,
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //重叠I/O
WWW_P※LCJS_CO※M-PLC-技-.术_网

   NULL
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

   );
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

将提示错误, 这样就OK:
P.L.C.技.术.网——可编程控制器技术门户

_com_handle = CreateFile(
WWcW_PLCJS_COM-PLC-技.术_网

   “\\\\.\\COM10“,//对应的就是\\.\COM10
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

   GENERIC_READ | GENERIC_WRITE,
WWW_PLC※JS_COM-PmLC-技.术_网

   0,
WWcW_PLCJS_COM-PLC-技.术_网

   NULL,
WWW_PLC※JS_COM-PmLC-技.术_网

   OPEN_EXISTING,
WWW_P※LCJS_COM-PLC-)技.术_网

   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //重叠I/O
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   NULL
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

   );
WWW_PLC※JS_COM-PmLC-技.术_网

    线程中循环的低效率问题
WWW_PL※CJS_COM-PLC-技.术_网

    使用SetCommMask(pcom->_com_handle, EV_RXCHAR | EV_ERR)监视接受字符和错误消息;一旦有个字符来就会激活WaitCommEvent 通常作以下接受操作:
WWW_PLCJS@_COM%-PLC-技.术_网

if(!WaitCommEvent(pcom->_com_handle, &mask, &pcom->_wait_o))
WWW_PLCJS_COM-PLC-技.术_网

   {
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

    if(GetLastError() == ERROR_IO_PENDING)
WWW.PLCJS.COM——可编程控制器技术门户

    {
W1WW_P4LCJS_COM-PLC-技.术_网

     GetOverlappedResult(pcom->_com_handle, &pcom->_wait_o, &length, true);
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    }
WW.W_PLCJS_COM-PLC-技.术_网

   }
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   if(mask & EV_ERR) // == EV_ERR
W1WW_P4LCJS_COM-PLC-技.术_网

    ClearCommError(pcom->_com_handle, &error, &stat);
WW.W_PLC※JS_C,OM-PL,C-技.术_网

   if(mask & EV_RXCHAR) // == EV_RXCHAR
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

   {
plcjs.技.术_网

        pcom->on_receive();//接收到字符
plcjs.技.术_网

        //或发送到窗口消息
plcjs.技.术_网

   }
WWW.PLCJS.COM——可编程控制器技术门户

这样频繁的函数调用或接受发送消息,效率低下,我添加扫描缓冲区的代码,当字符数超过设定的字符数才作接受字符的操作;
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

if(mask & EV_RXCHAR) // == EV_RXCHAR
WWW_PLCJS_COM-PLC-技.术_网

   {
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    ClearCommError(pcom->_com_handle, &error, &stat);

本新闻共11页,当前在第11 2  3  4  5  6  7  8  9  10  11  
W1WW_P4LCJS_COM-PLC-技.术_网

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行