在Windows下面如果要與COM通信的話,有二個辦法,要麼就用微軟的API,還有就是他提供的控件,前者功能強大,可造性強,但使用上面自己需要寫的代碼比較多,喜歡動手的朋友可以償試,還有一個就是MSCOMM控件了,這個微軟已經封裝好了,直接給出接口的形式,直接使用,比較省時,代碼量少,但可造性不強,但它的功能已經基本夠用了。
下面首先,安裝MSCOMM控件,如果是VC6.0則,會自帶,在VS2003以後好像就沒有了,這需要到VC6.0下面去複製對應控件文件過來,下面我把我用的文件上傳到附件裏,供大家使用,裏面有四個文件,複製到/windows/system32下面就行,然後運行BAT會自動註冊,安逸啊
註冊好後,到VS2005IDE上,在工具-選則工具箱項,彈出來的對話框中選COM組件,找到MSCOMM,確定即可,然後添加對應的變量關聯,控制對應的頭文件mscomm.h和源文件mscomm.cpp就會自動添加到工程中。
這下就沒啥事了,直接使用,封裝的代碼如下:
class CComApp { private: CMscomm *m_mscomm; public: CComApp(CMscomm* mscomm); void OpenCom(); void OpenCom(int ComPort,int sThreshold,int rThreshold,int imputMode,CString csSeting); void CloseCom(); void SendComData(CString csData); CString ReceiveComData(BOOL isCString); public: ~CComApp(void); };
void CComApp::OpenCom() { m_mscomm->put__CommPort(1); m_mscomm->put_SThreshold(0); m_mscomm->put_RThreshold(1); m_mscomm->put_InputMode(1); m_mscomm->put_Settings(_T("9600,n,8,1")); m_mscomm->put_PortOpen(TRUE); } void CComApp::OpenCom(int ComPort, int sThreshold, int rThreshold, int imputMode, CString csSeting) { m_mscomm->put__CommPort(ComPort); m_mscomm->put_SThreshold(sThreshold); m_mscomm->put_RThreshold(rThreshold); m_mscomm->put_InputMode(imputMode); m_mscomm->put_Settings(csSeting); m_mscomm->put_PortOpen(TRUE); } void CComApp::CloseCom() { m_mscomm->put_PortOpen(FALSE); } void CComApp::SendComData(CString csData) { m_mscomm->put_Output(COleVariant(csData)); } CString CComApp::ReceiveComData(BOOL isCString) { VARIANT variant_inp; CString csStrRecvData,csHexRecvData; COleSafeArray safearray_inp; long length,i; BYTE data[1024]; CString csStr; variant_inp=m_mscomm->get_Input(); //讀取緩衝區內的數據 safearray_inp=variant_inp; //將VARIANT型變量轉換爲ColeSafeArray型變量 length=safearray_inp.GetOneDimSize(); //確定數據長度 for(i=0;i<length;i++) { safearray_inp.GetElement(&i,data+i); //將數據轉換爲BYTE型數組 } if (isCString) { for(i=0;i<length;i++) //將數組轉換爲Cstring型變量 { BYTE a=* (char *)(data+i); csStr.Format(_T("%c"),a); csStrRecvData += csStr; } return csStrRecvData; }else{ for(i=0;i<length;i++) //將數組轉換爲十六進制 { BYTE a=* (char *)(data+i); csStr.Format(_T("%02X "),a); csHexRecvData += csStr; } return csHexRecvData; } }
呵呵 ,簡單的一個com打開,關閉,發送,接收的小類就做好拉,寫的不好的地方,請大家多多指教!