您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 用VB开发PC与单片机通信的上位机程序
串口通信是MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境有不少,诸如VB、VC++,Delphi、LABVIEW等等,不过无论黑猫还是白猫,能够抓到老鼠的就是好猫,用VB无疑是最快速最简便的,实现的功能也足够强大,足以满足我们的基本需要了。我最近用VB写出了一个用于数据采集的串口上位机程序,实现数据的接收和实时绘图,这里和大家分享一下,让大家也体验一下单片机和PC通信的乐趣。整个程序只需要不到30行程序,我将会给这30行程序加上最为详备的注释,这样即使你从未使用VB制作过上位机程序,也能照猫画虎的编写出属于自己的上位机程序。一,制定设计思路首先,我们要制定一下自己的串口通讯协议,为了方便设计,通讯协议中将采用字符型数据(遵循ASCII字符集)进行传输,一共5个字节数据,下位机按照从第一字节到第五字节的顺序以字符型形式发送数据,第一个字节是符号符,第二,三,四字节分别是百位,十位,和个位数字,第五个字节是结束符。通讯协议:注释:1,符号符,+(2B)或—(2D),表示数据的正负2,3,4,百位,十位,和个位数字5,结束符,用大写字母A(41)表示接着,我们就要明确设计思路了,这个程序的设计将采用MicrosoftVisualBasic6.0(以下简称VB6.0)作为m,通过编译环境,运用串口通讯控件MSCom计时器控件实现以查询方式编写的串口数据的接收和实时绘图。二,程序界面设计(1)创建一个标准EXE工程:启动VB6.0,在自动弹出的“新建工程”窗口中单击“标准EXE”图标,然后单击“打开”按钮即可创建一个标准EXE工程。将弹出的窗体的Caption属性设置为串口通讯与实时绘图程序。[attachment=1364699](1)添加串口通信控件MSComm:VB的串口通信控件MSComm并不会主动出现在工具箱中,当我们需要MSComm控件时,首先要把它加入工具箱中,选择“工程”菜单下的“部件...”子菜单,在弹出的“部件”对话框中,在“控件”选项卡属性中选中“MicrosoftCommControl6.0”,单击“确定”按钮后,在工具箱中就出现了一个形似电话的图标,这就是MSComm控件,选择MSComm控件的图标,将它添加到适当位置,采用默认名称MSComm1。[attachment=1364697][attachment=1364696](1)添加一个Timer控件用于自动接收字符:选择Timer控件的图标,将它添加到适当位置,采用默认名称Timer1,Interval属性为1,Enabled属性为False。(2)添加两个文本框控件用于显示数据:选择TexrBox控件的图标,将它添加到适当位置,采用默认名称Text1与Text2,Text属性均设置为空,设置Text2的属性MultiLine=True,ScrollBars=2-Vertical。Text1用于显示最新的一组数据,Text2用于储存之前的所有数据。(3)添加一个图形控件PictureBox用于实时绘图:选择PictureBox控件的图标,将它添加到适当1符号位2百位3十位4个位5结束符位置,拉伸成适当大小,采用默认名称Picture1,设置BackColor属性为白色。(4)添加一个按钮控件CommandButton用于打开串口:选择CommandButton控件的图标,将它添加到适当位置,采用默认名称Command1,设置Caption属性为打开串口。(5)添加一个Shape控件用于显示串口状态:选择Shape控件的图标,将它添加到适当位置,采用默认名称Shape1,设置FillStyle=0-Solid,Shape=3-Circle,FillColor设置为红色。(8)设置完成的程序窗体界面:[attachment=1364695]三,程序代码编写(1)双击程序中的按钮控件,在弹出的代码窗口中键入以下程序DimxAsInteger'定义变量x用于记录数据个数Dimy0AsInteger'定义变量y0用于记录上一次数据DimyAsInteger'定义变量y用于记录当前数据PrivateSubCommand1_Click()'下面的程序是在点击打开串口按钮后时要运行的MSComm1.CommPort=4'设置通信端口号为COM4,这个要根据自己所使用的串口而定MSComm1.Settings=4800,n,8,1'设置串口参数,表示传输速率为4800bit/s,没有奇偶校验位,8位数据位,1位停止位'这里串口上位机的设置一定要和下位机一致MSComm1.InputMode=0'接收文本型数据,如果设置为1则以二进制的形式取回传入的数据MSComm1.PortOpen=True'打开通信端口4'True即为打开端口,设置为False则为关上端口'如果CommPort属性设置为一个非法端口,则会产生错误68(设备无效)Picture1.Scale(0,1000)-(200,-1000)'定义Picture1的坐标系,左上角坐标值(0,1000)到右下角坐标值(200,-1000)Picture1.Line(0,0)-(200,0),RGB(0,0,255)'用RGB颜色(0,0,255)画出X轴Shape1.FillColor=RGB(0,255,0)'将指示灯调整为绿色Timer1.Enabled=True'启动Timer1定时器EndSub(2)双击程序中的Timer控件的图标,在弹出的代码窗口中键入以下程序PrivateSubTimer1_Timer()Dimbuf$'定义一个字符串变量buf=Trim(MSComm1.Input)'将串口接收缓冲区内的数据读入buf变量中IfLen(buf)0Andx=200Then'判断缓冲区内是否存在数据与数据个数有没有到达最大值Text1.Text=Text1.Text+buf'Text1中的数据等于原有的数据加上新接收的数据EndIfIfbuf=AAndx=200Then'如果接收到结束符“A”且数据个数没有到达最大值y=Val(Text1.Text)'用Val函数将Text1中的内容转换为数字然后赋值给y,正负的符号也会一同转换Picture1.PSet(x,y),RGB(255,0,0)'在Picture1上(x,y)位置用RGB颜色(255,0,0)颜色画点Picture1.Line(x-1,y0)-(x,y),RGB(255,0,0)'在上次数据(x-1,y1)和这次数据(x,y)之间用RGB颜色(255,0,0)颜色连线x=x+1'数据个数加1y0=y'把y值赋给用于记录上一个数据的变量y1Text2.Text=Text2.Text&x&&Str(y)&Chr(13)&Chr(10)'Text2中的数据等于原先的数据加上数据编号加上数据的值以及Chr(13)&Chr(10)组成的换行符Text2.SetFocusText2.SelStart=Len(Text2.Text)'设置垂直滚动条自动滚动Text1.Text='清空Text1控件中的数据EndIfEndSub四,调试运行我采用STC89C52作为下位机,采用11.0592M的晶振,通过串口发送数据进行测试。下面就以KeiluVision3作为编译环境,用C语言编写一个小例子用于测试,读者可以把这些做成一个模块加入到自己的程序中用于实验。首先加载头文件:#includereg52.h定义一个字符串数组:unsignedcodetab[10]={'0','1','2','3','4','5','6','7','8','9',};然后我们需要一个初始化串口通信的子函数,这里的设置要和上位机一致:voidStartUART(void)//波特率4800bit/s,无奇偶校验位,8位数据位,1位停止位{SCON=0x50;TMOD=0x20;TH1=0xFA;TL1=0xFA;PCON=0x00;TR1=1;}因为我们的上位机用Timer控件用于自动接收字符,所以下位机还需要个延时函数,用于在每次传输数据后稍微延时一下,否则会出现丢失数据的现象:voidDELAY_MS(unsignedinta)//毫秒级延时函数{unsignedinti;while(--a!=0){for(i=0;i125;i++);}}这样就可以从通过串口进行测试了(以发送123为例):voidmain(void){StartUART();//初始化串口SBUF=0X2B;//发送字符“+”DELAY_MS(20);//延时20msSBUF=tab[1];//发送百位的“1”DELAY_MS(20);SBUF=tab[2];//发送十位的“2”DELAY_MS(20);SBUF=tab[3];//发送个位的“3”DELAY_MS(20);SBUF=0X41;//发送字符“A”DELAY_MS(20);}在向单片机烧入程序,连接好串口后就可以进行测试了。测试过程:1,在VB6.0环境中,单击运行,然后点击启动2,单击“打开串口”按钮打开串口,如果正常打开串口的话指示灯会变成绿色。3,接通下位机电源,这时就可以看到从下位机不断传来的数据123以及实时绘图的画面。[attachment=1364698]至此,一个串口通讯与实时绘图的程序就开发完成了,在VB6.0中使用文件菜单下的生成工程1.exe...就可以生成.exe文件了,这样就能更方便使用。这篇文章只是个小例子,介绍了使用VB6.0开发串口上位机的过程,读者只需要稍微修改下程序,就可以适应自己的不同要求,例如通过给下位机送来的数据加上不同的结束符,从而使用不同的颜色实时绘图,或者将接收到的数据乘以0.1,将原来的百位,十位,个位,变成十位,个位,小数位等等。希望这篇文章能够抛砖引玉,让大家能够发挥自己的想象力,设计出更加友好的界面,为自己的上位机软件添加强大的功能。[attachment=1373614]
本文标题:用VB开发PC与单片机通信的上位机程序
链接地址:https://www.777doc.com/doc-2202573 .html