2008年(909)
分类:
2008-05-06 22:20:11
下载源代码 修正为 还有一些小的地方就不说了。
上一回我发表第一版本的串口类库,收到了不少来信
,提了不少意见和问题。我前一段时间又对这段代码作了修正,改动较大,主要思路没变,但更加规范并修改了几个错误。这次代码是完全按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;
}
这个版本相信足够用的, 我单位的在用串口加起来有四五十个,都没问题,还有问题欢迎来信批评指教。
下载本文示例代码
串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本串口类库的第二个版本