您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > VB编写上位机(MSComm控件)
上位机可方便地实现与单片机之间进行信息传递交互,能够更加容易对机械手臂进行控制,实现操作可视化,更加直观,保存重要数据等功能。我们利用VisualBasic6.0(以下简称VB)来编制上位机,VB是一种功能强大、简单易学的程序设计语言。它不但保留了原先Basic语言的全部功能,而且还增加了面向对象程序设计功能。它不仅可以方便快捷地编制适用于数据处理、多媒体等方面的程序,而且利用ActiveX控件MSComm还能十分方便地开发出使用计算机串口的计算机通信程序。本实验涉及控制六路舵机,所以需要编制上位机实现一次向下位机传输含有六个数据的数组,同时接受来自下位机的数组,并显示。整个过程可分为如下几个过程:一:VB是面向对象的语言,首先需要绘制程序界面该上位机大致分为左边的功能部分与右边的可视化调节部分。功能部分有端口选择,用以选择合适的端口进行串口通信,波特率选择,打开与关闭端口,动作设置等。为了便于布局,应用frame控件建立区域,再将控件拖到frame区域中,对于功能相同的控件来说,建立控件组的方式会使编程避免重复繁琐,例如HScrollbar控件,先向frame区域内拖入一个HScrollbar控件,再复制,粘贴到frame区域内部,则提示是否建立控件组,点击确定即可。这样便为后续编程带来很大的方便。调节部分运用Hscrollbar控件来粗略调节度数,设定按钮与文本框配合来精确调节输出度数。用右列文本框实时读取舵机当前角度。用optionbutton控件来选择hscrollbar的步进精度,这里分为0.1度与1度两个不同的选项。由于一组optionbutton中在程序运行中只能有一个处于选中状态,根据本程序要求,每一横列的两个optionbutton为一组,这样就需要frame控件,在同一个frame区域里的optionbutton默认为一组。这样就可以如上图所示的状态显示,否则真能选中其中的一个。端口与波特率的选择应用combobox控件。指示灯部分则用picturebox控件添加两个图片,分别为红灯与黑灯,用以显示端口的开关状态。每个MSComm控件对应于一个串行端口。使用多个串行口时,要使用多个MSComm控件。MSComm控件的主要属性及说明如下。“工程”——“部件”,选中MicrosoftCommcontrol6.0,“确定”,完成MSComm控件的添加。二:在完成了界面的绘制后,就需要对部分的控件的初始属性进行设置。并输入相应的程序代码。属性说明CommPort设置并返回通信端口号Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位PortOpen设置并返回通信端口的状态。也可以打开和关闭端口Input从接收缓冲区返回字符Output向传输缓冲区写一个字符有两种处理通信的方式:(1)事件驱动。利用OnComm事件捕获并处理通信事件,所有的通信事件和通信错误列表都包含在控件的CommEvent属性中。(2)查询方式。在程序关键功能之后,通过检查CommEvent的值来查询事件和错误。添加MScomm控件,并在窗体装入时进行初始化PrivateSubForm_Load()MSComm1.CommPort=1’端口选择1MSComm1.Settings=9600,N,8,1’定义数据传输协议,与下位机要保持一致。波特率9600,无奇偶验证,8个数据位,一个停止位。MSComm1.InputMode=1'数据传输为二进制方式MSComm1.InBufferCount=0'清空接受缓冲区MSComm1.RThreshold=1'产生MSComm事件IfMSComm1.PortOpen=FalseThenMSComm1.PortOpen=True'打开串口EndIfEndSub为随时判断端口是否开启,并用黑红等来显示当前状态,运用timer控件,将interval设置为100,双击控件并输入如下代码。则程序每隔100ms执行一次下面的程序。PrivateSubTimer2_Timer()IfMSComm1.PortOpen=tureThenPicture1.Visible=TruePicture2.Visible=False’对应红灯图片显示,黑灯图片不显示。ElsePicture2.Visible=TruePicture1.Visible=False’对应黑灯图片显示,红灯图片不显示。EndIfEndSub运用combobox控件来选择端口,波特率等MSComm的setting值,双击控件后输入如下代码PrivateSubCombo1_Click()IfCombo1.Text=COM1ThenMSComm1.CommPort=1ElseIfCombo1.Text=COM2ThenMSComm1.CommPort=2ElseIfCombo1.Text=COM3ThenMSComm1.CommPort=3ElseMSComm1.CommPort=4EndIfEndSub则选择端口部分完成。波特率部分同理。本项目向单片机传输的为六个1000~5000之间的整数,所以要将HScroll的min值设为1000,max值设为5000。1000~5000与角度0~180度之间相对应,即运用一次函数形式将HScroll.value值转变为度数赋给对应HScrollbar下方的文本框。PrivateSubHScroll1_Change()Text1.Text=Format(HScroll1.Value*0.045-45,0.0)EndSub同时如果在文本框中输入0~180之间的度数,点击“设定”按钮,需要将其度数对应的数值赋给HScroll.value,这样度数与Hscrollbar进度条之间便一一对应了。PrivateSubCommand3_Click()IfText1.Text=ThenMsgBox未输入数值,5,警告‘出现警告的提示框,提示”未输入数值”。ElseIfText1.Text0OrText1.Text180ThenMsgBox0-180为有效数值,5,警告’出现警告的提示框,提示0-180为有效数值ElseHScroll1.Value=Format((Text1.Text+45)*200/9,0)’仅保留个位数。EndIfEndSub由于PC与单片机之间的数据传输要以字节型数据传输,而字节数据的范围为0~256,所以本项目中将每个整数分成两个部分,千位与百位为一个数,个位与十位为一个数,即要想传送3456,则分别传送34与56两个数据,然后由下位机还原回3456。这样可以建立一个包含12个数据的字节型数组用以传输数据。先用包含6个数据的字符型数组储存6个四位数,再用Mid()函数来提取前两位与后两位然后将数据赋给包含12个数据字符型数组储存12个两位数,最后将此数组转换字符型数组。具体过程如下建立输出函数Submytest()Dimsenddata(0To5)AsStringDimrr(1To12)AsStringDimyy(1To12)AsByteDimiAsIntegerDimjAsIntegerDimkAsIntegerFork=0To5senddata(k)=HScroll1(k).ValueNextkFori=1To6rr(2*i-1)=Mid(senddata(i-1),1,2)rr(2*i)=Mid(senddata(i-1),3,2)NextiForj=1To12yy(j)=rr(j)NextjMSComm1.Output=yyEndSub设定HScroll1为一个控件数组,在其中运用call,则HScroll每改变一下位置,就会执行上述函数来向下位机发送数据,这就保证了上位机的实时性。由于上位机还需要发传感器等数据,为了便于下位机区分,先发送一个与下位机约定好的命令字节,如“A”发送后延时一段时间,以便让下位机准备接受此类数据。call以上函数,完成发送数据。以下为完整代码:PrivateSubHScroll1_Change(IndexAsInteger)MSComm1.Output=ADelay(500)‘延时500msCallmytestEndSub其中delay为延时函数,添加模块后在其中定义:PublicDeclareFunctiontimeGetTimeLibwinmm.dll()AsLongPublicSubDelay(ByValnumAsInteger)DimtAsLongt=timeGetTimeDoUntiltimeGetTime-t=numDoEventsLoopEndSub接收数据部分未发送数据的逆过程,运用oncomm事件来触发接收。由于下位机会发来不同长度的信息,为了使上位机判断是哪一种数据,同样可以使用上面例子中的方式,先发一个命令字节、延时、接受。这里我们用另一种方法,在数据前加一个开始字符,与数据一同发过来,上位机根据首字符而相应的选择数据的处理方式,当然事先要与下位机约定好。双击MScomm控件,输入代码。PrivateSubMSComm1_OnComm()Dimaa(1To6)AsStringDimbb(100)AsByteDimBufferAsVariantDimiAsIntegerDimjAsIntegerSelectCaseMSComm1.CommEventCase2Timer1.Enabled=True定时器打开MSComm1.InputLen=0一次性全部读入MSComm1.RThreshold=0禁止生成事件Buffer=MSComm1.InputFori=LBound(Buffer)ToUBound(Buffer)bb(i)=Buffer(i)NextiIfbb(0)=65ThenForj=1To6aa(j)=bb(2*j-1)*100+bb(2*j-0)Text7(6-j).Text=aa(j)NextjElseIfbb(0)=66Thenbb(0)=66Forj=1To6aa(j)=bb(2*j-1)*100+bb(2*j-0)Text7(6-j).Text=aa(j)Text9.Text=bb(2)NextjElseIfbb(0)=67ThenText9.Text=bb(2)EndIfEndSelectEndSub‘整个成四位数显示到文本框中三:这样上位机的基本部分完成,下面编制二级窗体,来进行永久保存数据,即将程序运行过程中处于内存中的数据保存到硬盘中的指定路径,以便下次再运行时调用,否则当程序关闭后内存释放,再打开上位机处于最初状态,仍然需要输入相应数据。向项目中添加窗体,首先绘制界面,文本框与控件组形式存在。点击主界面上的“动作一”按钮进入二级窗口,代码如下:PrivateSubCommand11_Click()Form2.ShowEndSub这里输入六组数据,每组为舵机的转动终点角度,这样机械手臂按顺序执行下去,生成一连串的动作。“永久保存”可在制定路径上生成txt文件用以保存已经调试好的数据,在下次用的时候可点击“载入数据”来调入上次保存的数据,点击发送可将这组数据全部发送给单片机。保存数据程序:PrivateSubCommand3_Click()DimiAsIntegerOpenC:\Users\test\Desktop\2.txtForOutputAs#2‘保存在桌面上,文件名为2.txtFori=0To35Print#2,Text1(i).TextNextiClose#2EndSub载入数据程序PrivateSubCommand4_Click()DimjAsIntegerDimiAsIntegerOpenC:\Users\test\Desktop\2.txtForInputAs#2DoWhileNotEOF(2)Forj=0To35LineInput#2,outputdatas(j)NextjLoopFori=0To35Form3.Text1(i).Text=outputdatas(i)Nex
本文标题:VB编写上位机(MSComm控件)
链接地址:https://www.777doc.com/doc-5634018 .html