网络与通信实验报告
题目:串口通行实验
班级:0309103
学号:030910338
姓名:田静
指导老师:付大丰
日期:20##-10-21
一、实验要求
把两台计算机的串口通过串口线连在一起,通过串口实现两台计算机通讯。可以利用高级语言、C语言编程实现,要求程序界面友好,有发送和接收功能,其接收和发送内容可在屏幕上显示。
二、实验原理
串口通讯把数据的字节分解成单个的二进制比特流依次传输,其结构简单,连接线少,应用非常广泛。实现串口通信的方法很多。如:利用标准通信函数实现串口通信、利用API实现串口通信和利用ActiveX控件实现。
本文主要采用ActiveX控件Microsoft CommunicationsControl(MSComm)编程,Windows平台先进的ActiveX技术使得对串口编程不再需要处理烦琐的细节。利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。
以下对ActiveX控件属性进行简单介绍,在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_comm),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性,这里只介绍其中几个常用属性:
CommPort:设置并回通讯端口号,缺省为COMl。
Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen:设置并返回通讯端口的状态,也可以打开和关闭端口。
Input:从接收缓冲区返回和删除字符。
Output:向发送缓冲区写一个字符串。
InputLen:设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。
InBufferCount:返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。
InputMode:定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。
RThreshold和SThreshold:表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。
三、实验步骤
1、建立应用工程
启动VC++6.0,创建一个基于对话框的MFC应用程序项目,选择Project菜单下Add to Project子菜单中的Components and Controls选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Con—trol version 6.0,单击insert按钮即可将通信控件插入该工程。添加该控件到对话框中,设置控件ID号为IDC _MSCOMM.
2、添加界面控件
将对话框中的按钮“取消”删除,将“确定”按钮改为“退出”。在对话框中添加适当的界面控件。本实验中需添加的标注用的静态控件、用于选择串口和设置波特率的组合框分别设置控件ID号为IDC_COMBO_SELECT和IDC _COMBO_BTL SET、添加控制开始发送/接收按钮控件并设置控件ID号为IDC_BUTTON_START,添加用于输入发送数据和输出接收数据的编辑框并设置控件ID号为IDC_EDIT_SEND和IDC_EDIT_RECEVE,同时为其设置各种属性。添加完后如下图:
3、映射控件通用消息
(1)打开MFC ClassWizard对话框,单击Member Valuable为相应控件添加变量。添加变量名和类型如下表:
如下图:
(2)单击Message Maps,添加对话框初始化函数BOOL CCOMM_TD lg::OnInitDialog();编辑加入代码如下:
BOOL CCOMM_TDlg::OnInitDialog()
{
// TODO: Add extra initialization here
m_comselect.AddString("COM1"); //为组合框设置选项,即设定串口选项
m_comselect.AddString("COM2");
m_comselect.AddString("COM3");
m_comselect.AddString("COM4");
m_comselect.AddString("COM5");
m_comselect.SetCurSel(0); //设置默认串口是COM1
m_btlset.AddString("2400");//为组合框设置选项,即设定波特率选项
m_btlset.AddString("4800");
m_btlset.AddString("9600");
m_btlset.AddString("19200");
m_btlset.AddString("38400");
m_btlset.SetCurSel(0);//设置默认波特率为2400
return TRUE; // return TRUE unless you set the focus to a control
}
(3)为按钮IDC_BUTTON_START添加单击响应函数void CCOMM_TDl g::OnButtonStart();函数代码如下:
void CCOMM_TDlg::OnButtonStart()
{
int n_com,n_set,i;
CString temp;
n_set=m_btlset.GetCurSel();//获取波特率选择索引号
switch(n_set) // 转换为对应的波特率
{
case 0:
i=19200;
break;
case 1:
i=2400;
break;
case 2:
i=38400;
break;
case 3:
i=4800;
break;
case 4:
i=9600;
break;
}
temp.Format("%d,n,8,1",i); //将设置参数转换为CString类型存入temp中
m_comm.SetSettings(temp);//波特率设置
m_comm.SetInputMode(1); //1:表示以二进制方式检取数据
m_comm.SetRThreshold(1);
m_comm.SetInBufferSize(1024);//设置输入缓冲区的大小
m_comm.SetOutBufferSize(512);//设置输出缓冲区的大小
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
n_com=m_comselect.GetCurSel();
m_comm.SetCommPort(n_com); //选择com
if( !m_comm.GetPortOpen())
m_comm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("不能打开该串口。");
m_comm.SetInputLen(0); //设置当前接收区数据长度为0
m_comm.GetInput();//先预读缓冲区以清除残留数据
UpdateData(TRUE); //读取编辑框内容
int Count=m_send.GetLength();//字符串长度
char TxData[1000];
int j;
for(j=0;j<Count;j++)
TxData[j]=m_send.GetAt(j);//要发送的字符串送字符数组
CByteArray array;
array.RemoveAll();
array.SetSize(Count);
for(j=0;j<Count;j++)
array.SetAt(j,TxData[j]);//将字符数组型
m_comm.SetOutput(COleVariant(array));//发送数据
// TODO: Add your control notification handler code here
}
(4)为IDC _MSCOMM添加消息映射函数void CCOMM_TDlg::OnOnCommMscomm()以便当接收缓冲区有数据时做相应处理。添加代码如下:
void CCOMM_TDlg::OnOnCommMscomm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_comm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_comm.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); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_recevedata+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容,显示接收到的数据
// TODO: Add your control notification handler code here
}
(5)编译、链接、运行会在相应工程目录下的debug目录下生成可执行的EXE文件。连接好串口线后运行该文件可进行串口通信。运行如下:
四、通信测试
A机运行如下:
B机运行如下:
五、实验心得
通过本次串口通信实验,让我对串口通信原理有了更近一步的理解。同时通过应用VC++ 6.0带的MFC进行串口通信API应用和用户界面制作,使我对VC++的使用更加熟练,同时也掌握了ActiveX控件的使用方法及原理。总之,在本次实验中我收获很多,不仅在通信方面的知识有所提升、VC++软件的使用更加熟练,而且也让我学会了一些调试的方法,通过编程实现如上功能的同时,也让我温习了以前所学的C以及C++语言的编程开发。
同时通过本课程的学习,让我了解了数据通信基础知识;计算机网络体系结构与协议;OSI参考模型和TCP/IP参考模型;网络连接设备如中继器、集线器、网桥、路由器、交换机等的工作原理等等;广域网实用组网技术;以太网组建和组网技术;计算机局域网相关知识和对等网络的组建等等。
总之,在本课程学习过程中我学到了很多我以前不知道的知识,我有所了解的计算机网络相关知识也得到了巩固。同时付老师在上课的时候也为我们介绍了一些使用的技术,使我们的操作能力也得到了提升。
第二篇:基于VC++6.0的串口通信的设计
基于VC++6.0的串口通信的设计
王娇,姚竹亭
(中北大学机械工程与自动化学院山西太原030051)
摘要:本文主要介绍了如何利用VC++6.0MSComm控件来实现PC与基于LPC2210的嵌入式系统之间的串口通信。以MFC来设计界面编制程序,同时用MSComm控件通过串口发送和接收数据,实现上下机位的串口通信。首先给出了系统的硬件组成与搭建,及系统的通信原理,接着分别实现上下机位的软件设计,最后通过具体实例由下机位向PC的串口输入一个字符串,并在ADSl.2的开发环境中,启动√吣①进行仿真调试,得到系统的测试结果。结果表明完全可以实现上下机位的通信联系,证明了该系统的可靠性和稳定性。
关键词:串口通信;vc++6.0;嵌入式系统;MSComm
中图分类号:TP391文献标识码:A
DesignofserialcommuniticationbasedonVC++6.0
WangJiao,YaoZhuting
(SchoolofMechanicalEngineeringandAutomation,
TheNorthUniversityofChina,TaiyuanShanxi,030051)
Abstract:ThisarticledescribeshowtousetheMSCommofVC++6.0
ontoachieveserialcom—municationbetweenthePCandembeddedsystembased
andprogrammingaccordingtoLPC2210.DesigningtheinterfacetoMFC。aswellusingMSCommcontrolsendandreceivedatathroughtheserialportinordertoachievetheupperandlowerslotsoftheserialcommunica—tion.First,thesystem7Shardwarecomponentsandstructures,communicationtheoryofsys—terns
anareintroduced;thenachievethesoftwaredesignofupperandlowerbits;finallywetakeaspecificexamplethatinputstringfromthelowerslottotheserialofPCandstartAXD
tOsimulationdebugginginthedevelopmentenvironmentofADSl.2
system.Theresultshowsthatwecanobtainthetestresultsofachievethecommunicationlinkoftheupperandlowerslots,andprovesthatreliabilityandstabilityOfthesystem.
Keywords:serialeommunitication;VC++6.0;embeddedsystem;MSComm
信程序一般可以用两种方法实现:①利用
0引{I|口MSCommActiveX串行通信控件;②使用Win—
dowsAPI通信函数。本文采用基于MSComm串
目前Win32中基于VC++6.0的常用串口通行通信控件的串口编程技术实现了嵌入式系统与ELECTRONICTEST
万方数据
PC的通信。PHII。IPS公司的LPC2210是基于一个支持实时仿真和跟踪的32位的ARM7TDMI—SCPU嵌入式RISC,具有UARTO,UARTl两个异步串行接口,和RS232电平转换电路,可与上位机进行通信。而基于VC-t-+的Windows平台的开发通常被用于与下位机的通信系统中。VC++是Windows下应用程序开发工具,在图形处理及数据管理方面具有很强的功能,利用它来开发与LPC2210通信的软件十分方便。
1
系统的硬件组成与搭建
1.1
RS232电平转换器
MAX232AESE芯片是MAXIM公司生产的
低功耗,单电源(+5伏)的双RS-232发送/接收器,能把输入的+5V电压转换成RS-232输出电平所需的±10V电压[1I。外围需接4个0.1uf/25V电解电容,供内部电压变换之需。1.2系统的通信原理
图l为LPC2210与PC的通信示意图,上机位的串口是COM2,PC的串口是RS232电平,所以与下位机连接时需要使用RS232电平转换器。然后再用普通的串口线把LPC2210的UART0与PC的COM2连接,上位机和下位机的波特率必须设置相同,本系统设置为9600Kbps。最后分别对上位机和下位机进行软件设计便可实现LPC2210与PC的通信了。为了验证通信效果,通过下位机向PC发送字符串
“Are
you
ok!”并在ADSl.2的开发环境中,启动
AXD进行仿真调试我们就可以在PC上看到发送的字符串。
一转换器I入隧旦
PC申口
LPC2210
COM2
图1LPC2210与PCCOM2的连接
万
方数据2应用MSComm控件实现系统的串行通信
2.1
MSComm控件介绍
MSComm(MicrosoftCommunications
Con—
tr01)控件是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,从而实现串口通信功能。具体地说,它提供了两种处理通信问题的方法:一种方法是事件驱动法:在这种情况下,当串
口上发生某一事件时,使用MSComm控件的On—
Comm事件可以捕获并处理这些事件。Oncomm
事件还可以检测并处理通信错误信息,根据通信事件或错误信息的数字代码就能查明到底是哪种事件或错误发生而触发OnComm事件。另一种方法
是查询法:在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。
MSComm控件有很多重要的属性,其中首要的几个如表1所示:
表1
属性
说明
CommPoft
设置/获取控件对应的串行U
Settings
设置/获取波特率、校验方式、数据位、停止位PortOpen
打开/关闭通信ElOutput
发送数据
2.2上机位软件设计
(1)建立应用工程
启动VC++6.0,创建一个基于对话框的MFC应用程序项目,选择Project菜单下Add
to
Project子菜单中的Components
and
Controls选
项,在弹出的对话框中双击RegisteredActiveX
Controls项,则所有注册过的ActiveX控件出现在列表框中。选择MicrosoftCommunications
Con—
trolversion6.0,单击insert按钮即可将通信控件
插入该工程。
屯三理gi基
ELECTRONIC
TEST
(2)初始化并打开串口
对串口进行初始化,并在对话框内添加MSComm控件,设置变量为m_comSerial。初始化简单代码如下:
m—ctrlComm.SetCommPort(2);//选择
COM2
m_ctrlComm.SetlnputMode(1);//二进制输人方式
nL
ctrlComm.SetInBufferSize(1024);//设置
输入缓冲区的大小
m-ctrlComm.SetOutBufferSize(512);//设置
输出缓冲区的大小
m-ctrlComm.SetSettings(“9600,n,8,1”);//设置波特率,奇偶校验位等参数
if(!ctrlComm.GetPortOpen()//打开串口
HLctrlComm.SetPortOpen(TRUE)
m—ctrlComm.SetRThreshold(1);//一个字符引发一个事件
m_ctrlComm.SetlnputLen(0);//当前接受区的长度为0
m_ctrlComm.GetInput();
(3)发送数据,打开“建立类向导”,选中IDC—BUTTON—SEND,双击BN—CI。ICKED添加On—ButtonSend函数,在函数中添加如下代码:
VoidCcommTESTDlg::OnButtonSend()
{
UpdateData(TRUE);
int
Count=1TI—send.GetLength();//字符
串长度
char
TxData[1000];
for(inti=O;i<Count;i++)
TxData[i]一m—sendGetAt(i);//要发送的
字符串送字符数组
CByteArrayarray;
array.RemoveAll():array.SetSize(Count);
for(i=0;i<Count;i++)
array.SetAt(i,TxData[i]);//将字符数组型
屯蚤塑gi基
ELECTRONICTEST
万
方数据转换CByteArray型变量
rn—ctrlComm.SetOutput(COIeVariant(ar—ray));
2.3下机位软件设计
LP2210具有两个异步串行接口UARTo和UARTl,它们均具有16字节的收发FIFO且寄存器位置符合16C500工业标准,内置了波特率发生器,UxDLL和UxDLM寄存器中方便的设置串口
的波特率,UxDI。M包含除数的高8位,UxDLL包含除数的低8位,这样得到的波特率为:
UxDI。M,UxDI。L=Fpclk/(16*baud)<Fp—clk为VPB时钟,baud为所设置的波特率>
在本例中LPC2210可以用C语言嵌汇编语言进行编程,流程图如下图2所示。
图2下机位流程图
3程序测试及结果
程序测试过程中,在连接硬件前先利用串口调试助手进行演示,串口是正常工作的,可以自由接受和发送。接着连接硬件串口UART0,在ADSl.2上的编译环境下,利用VC++开发工具可以实现数据的发送显示,在PC上显示的通信结果如下图3所示。
4结束语
本文对VC++提供的串行通信控件
[3]胡文涛,孙俊逸.微机串口通信系统的Visual
c++
实现[J].武汉船舶职业技术学院学报,2007(2):41—
43.
[4]胡赤兵,桑瑞鹏.利用Visualc++6.0编制串行通
信程序的实现[J].电气传动自动化,2006,28(4):
48—50.
[5]李驹光,郑耿.基于串行通信的应用程序开发[J].电
脑编程技巧与维护,2006(2):76
80.
[6]徐速,李盛渝.单片机与PC机的串口通信[J].重庆
工商大学学报:自然科学版,2005,22(4):360
363.
[7]于红芸,徐卫华,顾文锦,宋瑞华.Vc++中利用
图3测试结果显示
ActiveX控件实现串口通信的方法与实例[JJ.海军
航空工程学院学报,2004,19(5):581—584.
[8]王莉,阳春华.基于VC++的串口通信设计及其应
MSComm编程的方法做了探讨,实现了PC与LPC2200之间的通讯,显示了ActiveX技术的强大功能,充分的灵活性和易用性,完全可以实现上下机位的通讯联系。
参考文献
[1]王华,岳丽全,岳志高.MSComm控件在vc++6.0
用[J].控制工程,2004,11(S1):89—92.
作者简介
王矫,在读硕士生,主要研究方向:嵌入式系统。
E-mail:88一wi221@163.coral
串口通信中的应用[J].长春工程学院学报:自然科
学版,2009,10(1):72—73.
[2]李丰堂,谢明红.基于vC++的PC与PLC的通信
软件设计口].计算机技术与发展,2008,18(8):219—
222.
姚竹亭,硕士生导师,主要研究方向:计算机控制,机电系统的检测、测控技术等
(上接第16页)
[6]任尚斌,慕忠义.空气振动自动测试矫顽力计,Elee—
参考文献
[1]
田民波.磁性材料进展[J].物理与工程,2002,12
(1):143.
tromechanicalComponents1995,12.
[7]任尚斌.赵继文.智能矫顽力计及其应用[J].机电元
件,1996(12):33—35.
[2][3]
刘兴民.直流磁性测量[M].北京,机械工业出版社,
1989:4.
[8]慕忠义,孙国华,贾焕歌.电磁继电器磁性零部件矫
顽力自动测量方法[J].中国测试技术,2007(3):12.
作者简介
慕忠义,1976年毕业于兰州大学物理系磁学专业。从事电磁计量和科研开发。正高级工程师。
E-mail:mzyi@siamcom
何水校.磁性测量技术及专用仪器现状与发展EJ].
LSI制造与测试,1996,17:13.
[4]李大明,曲伟.一种新型的矫顽力测试仪[J].电测与仪表,1996,9:43.
[5]GB3656—83,软磁合金直流磁性能测量方法,冶金工业部,1983.
e万方数据
屯蚤型i亘
ELECTRONICTEST
基于VC++6.0的串口通信的设计
作者:
作者单位:
刊名:
英文刊名:
年,卷(期):
被引用次数:王娇, 姚竹亭中北大学机械工程与自动化学院,山西太原,030051电子测试ELECTRONIC TEST2009(11)1次
参考文献(8条)
1.王莉;阳春华 基于VC++的串口通信设计及其应用[期刊论文]-控制工程 2004(z1)
2.于红芸;徐卫华;顾文锦;宋瑞华 VC++中利用ActiveX控件实现串口通信的方法与实例[期刊论文]-海军航空工程学院学报 2004(05)
3.徐速;李盛渝 单片机与PC机的串口通信[期刊论文]-重庆工商大学学报(自然科学版) 2005(04)
4.李驹光;郑耿 基于串行通信的应用程序开发[期刊论文]-电脑编程技巧与维护 2006(02)
5.胡赤兵;桑瑞鹏 利用Visual C++6.0编制串行通信程序的实现[期刊论文]-电气传动自动化 2006(04)
6.胡文涛;孙俊逸 微机串口通信系统的Visual C++实现[期刊论文]-武汉船舶职业技术学院学报 2007(02)
7.李丰堂;谢明红 基于VC++的PC与PLC的通信软件设计[期刊论文]-计算机技术与发展 2008(08)
8.王华;岳丽全;岳志高 MSComm控件在VC++6.0 串口通信中的应用[期刊论文]-长春工程学院学报(自然科学版)2009(01)
引证文献(1条)
1.闫露露.王容石子.尹继武 基于AT89C51的数字集成电路测试仪的设计[期刊论文]-电子质量 2010(8)
本文链接:http://d..cn/Periodical_dzcs200911012.aspx