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); W1WW_P4LCJS_COM-PLC-技.术_网