在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打开,关闭,发送,接收的小类就做好拉,写的不好的地方,请大家多多指教!
本文出自 “西边太阳” 博客,请务必保留此出处http://thgenius.blog.51cto.com/1042803/1322019