串口与界面设计.docx
《串口与界面设计.docx》由会员分享,可在线阅读,更多相关《串口与界面设计.docx(21页珍藏版)》请在冰豆网上搜索。
![串口与界面设计.docx](https://file1.bdocx.com/fileroot1/2022-10/29/8452e899-2151-4ee6-9ac6-30ccbff7a0fe/8452e899-2151-4ee6-9ac6-30ccbff7a0fe1.gif)
串口与界面设计
串口虚拟软件VSPD软件的使用
VSPD是纯软件模拟实现的虚拟串口软件,对串口通讯应用系统程序的调试具有很好的帮助作用。
安装并启动该软件后出现如下图1界面。
图1VSPD操作界面图
1、添加串口
单击“添加端口”将成对添加虚拟串口,如图1中所示。
该计算机中已有物理串口COM1和COM2,已经添加了COM3、COM4虚拟串口。
再次点击“添加串口”时将添加COM5、COM6串口。
2、重置串口
单击“重置端口”将出现删除所有虚拟串口的界面,确定后将删除所有虚拟串口。
3、虚拟串口的使用
虚拟串口你的使用与物理串口一样。
但需要注意的是必须按照前面添加时的顺序而成对使用。
如上述图1中COM3只能与COM4配对使用。
打开两个串口调试助手窗口,一个使用COM3,另一个使用COM4。
若波特率、数据位数、奇偶校验都一致时,即可顺利实现双方的数据发送与接收。
如图2所示。
当用户设计开发应用程序时,使用串口调试助手使用其中一个虚拟串口,而用户程序使用该对的另一个虚拟串口,在串行通讯参数设置一致的情况下,进行发送和接收程序的调试。
图2使用串口调试助手实现两个虚拟串口之间的通讯
串口调试助手软件的使用
目前辅助用户调试串口应用程序的软件很多,如串口调试助手等,它们的主要功能基本一样,但也有细微区别。
有些软件可以实时反映当前计算机的所有串口,包括物理与虚拟串口,有些软件则是提供一定范围内的串口号,供用户选择,如从COM1到COM10。
此类软件的使用很简单,不再叙述。
用户串口应用程序的设计实现
目前编写串口应用程序的方法主要有三种。
一是使用串行通讯API函数,二是使用MSCOMM控件,三是使用第三方开发的串行通讯类(如Serialport)或动态链接库。
在此介绍使用简单的MSCOMM控件。
1、MSCOMM控件的注册
在VS2005/VS2010环境下使用该控件时首先要进行注册。
将MSCOMM控件文件mscomm32.ocx放到windows/system32文件夹下。
点击开始->运行,输入:
Regsvr32mscomm32.ocx,按确定按钮,弹出对话框表示成功。
图3MSCOMM控件注册成功界面
2、使用方法
(1)新建一个MFC应用程序(基于对话框)
(2)在对话框上右击鼠标,出现如图4快捷菜单。
图4快捷菜单
(3)单击“插入ActiveX控件”,出现如图5界面。
选择MicrosoftCommunicationControl.Version6.0,即可在对话框上出现以电话图标形式的MSCOMM控件。
图5选择MSCOMM控件
(4)右击该图标,在快捷菜单中选择“添加变量”,如m_mscomm1。
然后在该控件的属性里添加OnComm函数(右侧属性栏上方有一个闪电图标,就是添加消息响应的地方)。
(5)添加两个编辑控件,分别添加其对应CString变量m_rev、m_send。
添加一个命令按钮IDC_BUTTON1,用于发送数据。
图6对话框设计
(6)编写代码
1)在BOOLCXXXDlg:
:
OnInitDialog()初始化函数里添加如下代码:
//TODO:
在此添加额外的初始化代码
m_mscomm1.put_CommPort(3);//端口号为3
m_mscomm1.put_InBufferSize(1024);//设置输入缓冲区的大小,Bytes
m_mscomm1.put_OutBufferSize(512);//设置输出缓冲区的大小,Bytes
if(!
m_mscomm1.get_PortOpen())//打开串口
{
m_mscomm1.put_PortOpen(true);
}
m_mscomm1.put_InputMode
(1);//设置输入方式为二进制方式
m_mscomm1.put_Settings(L"9600,n,8,1");//设置波特率等参数
m_mscomm1.put_RThreshold
(1);//为1表示有一个字符即引发事件
m_mscomm1.put_InputLen(0);
2)OnCommMscomm1()接收数据代码
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
longi=0;
intlen;
charrxdata[1000];
switch(m_mscomm1.get_CommEvent())
{
case2:
//表示接缓冲区内有字符
variant_inp=m_mscomm1.get_Input();//接收数据
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();
for(i=0;i{
safearray_inp.GetElement(&i,&rxdata[i]);
}
rxdata[i]='\0';
m_rev=rxdata;
UpdateData(false);//将接收数据进行显示
break;
default:
break;
}
3)发送代码
如果是字符串CString:
UpdateData();
m_mscomm1.put_Output(COleVariant(m_send));
如果发送的是字节,程序如下:
byteinst[9];
CByteArraysendArr;
sendArr.SetSize(9);
for(intj=0;j<9;j++)
{
sendArr.SetAt(j,inst[j]);
}
m_mscomm1.put_Output(COleVariant(sendArr));
图7通讯结果
串口通讯参数设置界面的设计实现
串行通讯参数包括串口号、数据位位数、波特率、校验类型及停止位位数等。
在对话框界面中通常使用组合框或列表框来实现。
1、使用MFC向导建立对话框
在对话框中添加MSCOMM控件,添加其控件变量m_mscomm1。
在对话框中添加组合框IDC_COMBO1,为其添加变量m_comnum,类型为int。
在IDC_COMBO1属性中的数据项中,添加COM1;COM2;COM3;COM4。
注意要用西文。
添加组合框IDC_COMBO2,为其添加变量m_boderate,类型为int。
在IDC_COMBO2属性中的数据项中,添加4800;9600;19200;38400。
添加组合框IDC_COMBO3,为其添加变量m_check,类型为int。
在IDC_COMBO3属性中的数据项中,添加n;O;P。
添加两个编辑控件,分别添加其对应CString变量m_rev、m_send。
添加一个命令按钮IDC_BUTTON1,用于打开串口。
添加一个命令按钮IDC_BUTTON2,用于发送数据。
2、打开串口
在打开串口按钮的代码中,首先判断各个组合框的值,然后打开相应的串口端口。
代码如下:
UpdateData();
m_mscomm1.put_CommPort(m_comnum+1);//端口号
m_mscomm1.put_InBufferSize(1024);//设置输入缓冲区的大小,Bytes
m_mscomm1.put_OutBufferSize(512);//设置输出缓冲区的大小,Bytes
if(!
m_mscomm1.get_PortOpen())//打开串口
{
m_mscomm1.put_PortOpen(true);
}
m_mscomm1.put_InputMode
(1);//设置输入方式为二进制方式
//m_mscomm1.put_Settings(L"9600,n,8,1");//设置波特率等参数
CStringstr,str0,str1,str2,str3,strr;
intboderate;
strr=",";
str2="8";
str3="1";
boderate=pow(2.0,m_boderate)*4800;
str0.Format(_T("%d"),boderate);
if(m_check==0)
str1="n";
elseif(m_check==1)
str1="O";
else
str1="P";
str=str0+strr+str1+strr+str2+strr+str3;
m_mscomm1.put_Settings(str);
m_mscomm1.put_RThreshold
(1);//为表示有一个字符即引发事件
m_mscomm1.put_InputLen(0);
3、接收数据
接收事件中的代码如下:
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
longi=0;
intlen;
charrxdata[1000];
switch(m_mscomm1.get_CommEvent())
{
case2:
//表示接缓冲区内有字符
variant_inp=m_mscomm1.get_Input();//接收数据
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();
for(i=0;i{
safearray_inp.GetElement(&i,&rxdata[i]);
}
rxdata[i]='\0';
m_rev+=rxdata;
UpdateData(false);
break;
default:
break;
}
4、发送数据
发送数据按钮的代码为:
UpdateData();
m_mscomm1.put_Output(COleVariant(m_send));
利用CStdioFile类读写文件
在使用VisualC++.NET进行编程时,我们经常需要把程序中得到的数据进行保存,以便日后进行数据处理。
本文介绍一种使用CStdioFile类的方法将得到的数据保存为txt格式的文本文件,并且可以利用CStdioFile类读取txt文本文件中的数据。
MFC中使用CStdioFile类封装了C++运行时刻文件流的操作,流文件采用缓冲方式,支持文件模式和二进制模式文件操作,默认方式为文本模式。
CStdioFile类从CFile类继承,具有如下三个构造函数:
1、CStdioFile():
建立一个CStdioFile类的对象,但不打开文件;
2、CStdioFile(FILE*pOpenStream):
建立一个CStdioFile类的对象,并将该对象同一个已经打开的文件相联系;
3、CStdioFile(LPCTSTRlpszFileName,UINTnOpenFlags):
建立一个CStdioFile类的对象,同时打开一个文件,nOpenFlags是打开文件的方式,它可以取值如下所述:
以上是几种常用的打开方式,还有另外几种可以去查阅相关资料。
例如你可以这样创建一个新文件:
CStdioFileFile;
File.Open("文本名.txt",CFile:
:
modeCreate|CFile:
:
modeWrite);
表示创建一个名为“文本名”扩展名为TXT的只写文件,另外因为没有说