串口通信是很常见的比如GPS, GPRS,单片机等等一些外设仪器都是采用串口通信,所以串口通信在一些项目中很常见也很重要。
VC++编写串口通信的方法有很多种,我这里说的是使用微软提供的ActiveX控件MsComm来进行通信的。要使用MsComm控件,你就必须先在你的系统中注册这个控件,具体的注册方法网上也很多,我就不说了。
注册好控件后,你就在你建好的工程的对话框上”右击”选择”添加ActiveX控件”, 在弹出的窗口中选MsComm就完成了MsComm控件对你现在的项目的支持。此时vs会在你的项目中添加一个从CWnd派生出来的类CMscomm1,我们也就是通过这个类来进行通信的。
然后在你的对话框类里面添加一个CMscomm1 的对象m_comm及函数
OnCommMscomm1,添加m_comm对象的目的很明显,因为只有将CMscomm1类进行的实例化才能进行通信。而添加函数OnCommMscomm1是因为MsComm控件是采用了事件驱动法进行通信的,也就是说只要当相应的串口有变化,MsComm控件就会引发一个OnComm的事件,然后再由OnCommMscomm1对该事件进行响应。要想
OnCommMscomm1函数对OnComm事件进行响应,那么我们还需要添加一个事件接受映射,让MsComm知道是由OnCommMscomm1进行接收该事件的处理。事件接收映射添加代码如下:
? ? ?
BEGIN_EVENTSINK_MAP(CsdDlg,CDialog)
ON_EVENT(CsdDlg,IDC_MSCOMM1,1,CsdDlg::OnCommMscomm1,VTS_NONE) END_EVENTSINK_MAP()
上面的都完成后,就需要在OnInitDialog函数中添加串口通信的一些初始化代码:
? ? ? ? ?
//如果端口原来打开,则需要先关闭 if(m_comm.get_PortOpen()) m_comm.put_PortOpen(FALSE);
// _T(\串口参数,波特率:38400, 8为数据位,1为停止位 //设置连接参数
? m_comm.put__CommPort(2); //指定串口号
?? m_comm.put_Settings(_T(\9600, n, 8, 1\));//通信参数设置 ?? m_comm.put_InBufferSize(1024);//指定接收缓冲区大小 ?? m_comm.put_InBufferCount(0); //清空输入缓冲区 ?? m_comm.put_InputMode(0); //文本模式获取数据 ?? m_comm.put_InputLen(0); //读取缓冲区的全部数据
?? m_comm.put_RThreshold(1); //设置在产生OnComm事件前要接收的字符数阈值 ??
?? //打开端口连接
?? if(!m_comm.get_PortOpen()) ?? m_comm.put_PortOpen(TRUE);
MsComm的初始化的一些参数我就不介绍了,网上也很多。我上面的代码,我使用的是串口2,通信设备的波特率为9600.
通过上面的操作,我们可以实现VC++的串口通信,要通信,就要有接收很发送,接收信息的事件是在OnComm事件中,我们可以通过MsComm的get_CommEvent() 这个属性来判断发来的信息是否是有效的,然后通过get_Input()取得发来的信息。
?? if(m_comm.get_CommEvent() <1000) { ?? VARIANT var_in;
?? var_in =m_comm.get_Input(); //读缓冲区
?? CString str =var_in.bstrVal; //转换成CString类型 ??
?? m_stc.SetWindowTextW(str); ??
?? if(str ==_T(\D\)) {
?? m_stc.SetWindowTextW(_T(\收到\)); ?? } ?? }
我的代码还对信息的内容进行判断,然后收到的信息是一个字母D,那么才进行处理。 对于信息的发送,也很简单,直接put_Output()这个成员函数,比如我们需要向串口发送一个字母Z,那么我们可以如下:
?? void CsdDlg::OnBnClickedButton1() ?? {
?? // TODO: 在此添加控件通知处理程序代码 ?? // m_stc.SetWindowTextW(_T(\正转\ ?? m_comm.put_Output(COleVariant(_T(\Z\))); ?? }
其中COleVariant是一个嵌入式的变量类型。
就这么简单,可以实现VC++程序跟串口之间进行的通信。其实我上面的通信还是比较简单,一般通信为了保证信息的准确性及可靠性,通信的时候都需要加上”三次握手”等通信来保证可靠的通信。
我的代码写的时候,我是使用凌阳单片机进行通信的,其实其它都一样样。 在我的百度Hi里面,有很多以前我收集的VC++关于串口通信的资料,如果你有兴趣,可以在友情链接里面的链接进入我的百度hi去查看文章。