工程下載:http://www.shnenglu.com/Files/richardzeng/C++中實(shí)現(xiàn)串口操作類(lèi)%20SerialPortLib.rar
最近封裝了一個(gè)串口類(lèi),與大家分享,該類(lèi)的主要特點(diǎn)是:能實(shí)現(xiàn)數(shù)據(jù)的異步接收;無(wú)須MFC的支持;只能在VS2003編譯通過(guò),但只要做少量修改就可以在VC6.0中使用.使用起來(lái)非常簡(jiǎn)單,主要代碼如下:
1 #include "stdafx.h"
2 #include "comm_exception.h"
3 #include "SerialPort.h"
4 #include "serialportobservertest.h"
5
6 using namespace C2217::StdLib;
7 using namespace IBMS;
8
9 int _tmain(int argc, _TCHAR* argv[])
10 {
11 try
12 {
13 //聲明一個(gè)串口觀察者
14 CSerialPortObserverTest portObserver;
15 //聲明串口1
16 CSerialPort port(1);
17 //注冊(cè)串口的觀察者
18 port.AtachPortObserver(&portObserver);
19 //打開(kāi)串口
20 port.Open();
21 byte data[100] = {0};
22
23 port.Send(data,sizeof(data));
24 }
25 catch(comm_exception &e)
26 {
27 SET_CATCH_POS(e);
28 std::cout << e;
29 }
30
31 return 0;
32 }
33
串口數(shù)據(jù)的接收在
void CSerialPortObserverTest::OnSerialPortReceive(CSerialPort *pSerialPort, byte *pData, size_t nDataLen)
{
cout << pSerialPort->GetName().c_str() << "Received Data: "<<endl;
for(size_t i=0; i< nDataLen ;++i )
{
cout << pData[i] << " " ;
}
cout <<endl;
}
完成,你也可以不使用觀察者,直接重寫(xiě)void CSerialPort::OnReceiveData(byte *pData, size_t nDataLen)可以獲得更好的執(zhí)行效率。去掉觀察者對(duì)象list.
有什么問(wèn)題郵件聯(lián)系:dyj057@gmail.com
# re: C++中實(shí)現(xiàn)串口操作類(lèi) 2005-12-22 18:34
我看你的程序使用了一個(gè)叫IbmsSerialPort.dll的dll來(lái)完成通訊
而這個(gè)IbmsSerialPort.dll首先使用CreateFile,然后使用GetCommState等等一系列communications resource function來(lái)完成端口通訊
ok,學(xué)到了一些東西
回復(fù)
# re: C++中實(shí)現(xiàn)串口操作類(lèi) 2006-03-01 10:44
CreateFile對(duì)串口操作是獨(dú)占的,其他的應(yīng)用程序就不能打開(kāi),怎么實(shí)現(xiàn)觀察者的角色呢?想請(qǐng)教樓主!msn:a.zlp@163.com
回復(fù)
# re: C++中實(shí)現(xiàn)串口操作類(lèi)
2006-03-01 12:00
這個(gè)簡(jiǎn)單,當(dāng)你發(fā)送數(shù)據(jù)的時(shí)候,也發(fā)送一份到觀察者.接收到數(shù)據(jù)的時(shí)候,也轉(zhuǎn)一份到觀察者。
回復(fù)