最近有点时间,所以学习一下基于VC的串口通讯。
在VC下实现串口通讯有两种方法:
一种是直接使用 MSComm32 控件,这种方法比较简单,只需要之直接调用相应的控件类的接口就可以对串口进行操作。
另一种方法就是使用Windows的API接口,相对比较复杂。
再次就先介绍第一种方法,第二种方法等下次总结的时候在将它记下来。
NOTE:读者若需要完整的实例,可以到以下链接下载,里面含有具体的实例,以及实现所需功能要用到的几个文件
MSComm32.ocx、mscomm.cpp、mscomm.h
http://download.csdn.net/detail/xbmoxia/7096493
本人使用的开发环境是VC2010,若是其它平台,只要对配置做一下更改就可以。
一、先创建一个工程,如“MSCommTest”
二、加载MSComm32控件
依次选择“工具—选择工具箱项”,出现以下界面,然后依次勾选红色方框的内容并按“确定”。
若是读者没有找到“Microsoft Communications Control,version 6.0”,那可能是因为你的电脑里面系统路径里面没有“MSComm32.ocx”文件,且没有注册MSCom32控件。读者可以到以上链接下载需要的几个文件,然后将“MSComm32.ocx”拷贝到“C:\WINDOWS\system32”路径下面,然后点击桌面“开始——运行”,在里面输入:
“regsvr32 C:\WINDOWS\system32\MSComm32.OCX”,然后回车确认进行该控件的注册。
三、回到刚才创建的工程,然后将“mscomm.h”和“mscomm.cpp”添加到工程里面,并在“stdafx.h”里面添加#include "mscomm.h" 这句话。
四、添加 MSComm32 控件,以及其它必要的控件到对话框资源(当你成功做完第二步后,会在你的控件栏里出现一个MSComm32控件,如下画红色方框的控件),如图
五、为你刚才添加的控件添加相应的控件关联变量
CButton m_ctrlHexSend; CButton m_ctrlHexDiaplay; BOOL m_bAutoSend; CString m_strRXData; CString m_strTXData; CMSComm m_ctrlComm;
其中控关联变量“CMSComm m_ctrlComm;”需要你自己为它添加相应的响应代码
void CMSCommTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CHECK_HEX, m_ctrlHexSend);
DDX_Control(pDX, IDC_CHECK_HEXDISPLAY, m_ctrlHexDiaplay);
DDX_Check(pDX, IDC_CHECK_AUTOSEND, m_bAutoSend);
DDX_Text(pDX, IDC_EDIT_RXDATA, m_strRXData);
DDX_Text(pDX, IDC_EDIT_TXDATA, m_strTXData);
DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
}
以上就是前期准备,现在可以开始编写控件初始化代码以及相应的发送和接收功能函数了。
六、初始化COM口
1.在***Dlg.h 里面添加爱函数声明“void InitComm();”
2.在***Dlg.cpp里面定义函数
void CMSCommTestDlg::InitComm() { if(m_ctrlComm.GetPortOpen()) m_ctrlComm.SetPortOpen(FALSE); m_ctrlComm.SetCommPort(1); //选择com1 if( !m_ctrlComm.GetPortOpen()) m_ctrlComm.SetPortOpen(TRUE);//打开串口 else AfxMessageBox("cannot open serial port"); m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位 m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据 m_ctrlComm.SetRThreshold(1); //串口接收缓冲区中有1个字符就引发接收OnComm事件 m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0 m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 }
七、添加发送 和 接受串口数据的功能代码
1.分别为“发送按钮”和“接受按钮”添加单击响应函数,在“资源视图”里面分别单击那两个按钮就可以了。
2.定义这两个函数,如下
void CMSCommTestDlg::OnBnClickedBtnRxdata() { // TODO: 在此添加控件通知处理程序代码 VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { variant_inp=m_ctrlComm.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k); //字符型 if(m_ctrlHexDiaplay.GetCheck()) strtemp.Format("%02X ",bt); //以十六进制方式送入临时变量strtemp存放 else strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strRXData+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容 } void CMSCommTestDlg::OnBnClickedBtnTxdata() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); //读取编辑框内容 if(m_ctrlHexSend.GetCheck()) { //CByteArray hexdata; //int len=String2Hex(m_strTXData,hexdata); // len可以用于计算发送了多少个十六进制数 m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据 } else m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据 }
以上步骤都做完后就差不多了,不过差一点,就是需要为MSCom32控件添加相应的“触发事件”。
方法如下图所示:
以上操作都完成后就可以正常实现串口的首发功能了,不过读者应先使用“杜邦导线”把电脑的“COM1”串口的 TXD 和 RXD 引脚连接起来,这样就可以实现自发自收了。
VC2010基于MSComm32控件的串口通讯,布布扣,bubuko.com
原文:http://blog.csdn.net/xbmoxia/article/details/22067161