分类: C/C++
2008-03-13 17:09:59
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; }这个版本相信足够用的, 我单位的在用串口加起来有四五十个,都没问题,还有问题欢迎来信批评指教。