用VB开发PC与单片机通信的上位机程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 符号位
2 百位
3 十位
4 个位
注释:
1,符号符,+(2B)或—(2D),表示数据的正负
2,3,4,百位,十位,和个位数字
5,结束符,用大写字母A(41)表示
接着,我们就要明确设计思路了,这个程序的设计将采用Microsoft Visual Basic 6.0(以下简称VB6.0)作为编译环境,运用串口通讯控件MSComm,通过计时器控件实现以查询方式编写的串口数据的接收和实时绘图。
二,程序界面设计
(1)创建一个标准EXE工程:启动VB6.0,在自动弹出的“新建工程”窗口中单击“标准EXE”图标,然后单击“打开”按钮即可创建一个标准EXE工程。
将弹出的窗体的Caption属性设置为串口通讯与实时绘图程序。
[attachment=1364699]
(1)添加串口通信控件MSComm:VB的串口通信控件MSComm并不会主动出现在工具箱中,当我们需要MSComm控件时,首先要把它加入工具箱中,选择“工程”菜单下的“部件...”子菜单,在弹出的“部件”对话框中,在“控件”选项卡属性中选中“Microsoft Comm Control 6.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控件的图标,将它添加到适当位置,拉伸成适当大小,采用默认名称Picture1,设置BackColor属性为白色。
(4)添加一个按钮控件CommandButton用于打开串口:选择CommandButton控件的图标,将它添加到适当位置,采用默认名称Command1,设置Caption属性为打开串口。
(5)添加一个Shape控件用于显示串口状态:选择Shape控件的图标,将它添加到适当位置,采用默认名称Shape1,设置FillStyle=0-Solid,Shape=3-Circle,FillColor设置为红色。
(8)设置完成的程序窗体界面:
[attachment=1364695]
三,程序代码编写(1)双击程序中的按钮控件,在弹出的代码窗口中键入以下程序
Dim x As Integer'定义变量x用于记录数据个数
Dim y0 As Integer'定义变量y0用于记录上一次数据
Dim y As Integer'定义变量y用于记录当前数据
Private Sub Command1_Click()'下面的程序是在点击打开串口按钮后时要运行的
mPort = 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定时器
End Sub
(2)双击程序中的Timer控件的图标,在弹出的代码窗口中键入以下程序Private Sub Timer1_Timer()
Dim buf$'定义一个字符串变量
buf = Trim(MSComm1.Input) '将串口接收缓冲区内的数据读入buf变量中
If Len(buf) <> 0 And x <= 200 Then'判断缓冲区内是否存在数据与数据个数有没有到达最大值
Text1.Text = Text1.Text + buf'Text1中的数据等于原有的数据加上新接收的数据
End If If buf = "A" And x <= 200 Then
'如果接收到结束符“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
'数据个数加1
y0 = y
'把y值赋给用于记录上一个数据的变量y1
Text2.Text = Text2.Text & x & " " & Str(y) & Chr(13) & Chr(10)
'Text2中的数据等于原先的数据加上数据编号加上数据的值以及Chr(13) & Chr(10)组成的换行符
Text2.SetFocus
Text2.SelStart = Len(Text2.Text)
'设置垂直滚动条自动滚动
Text1.Text = ""
'清空Text1控件中的数据
End If
End Sub
四,调试运行
我采用STC89C52作为下位机,采用11.0592M的晶振,通过串口发送数据进行测试。
下面就以Keil uVision3作为编译环境,用C语言编写一个小例子用于测试,读者可以把这些做成一个模块加入到自己的程序中用于实验。
首先加载头文件:#include <reg52.h>
定义一个字符串数组:unsigned code tab[10]={'0','1','2','3','4','5','6','7','8','9',};
然后我们需要一个初始化串口通信的子函数,这里的设置要和上位机一致:void StartUART( void ) //波特率4800bit/s,无奇偶校验位,8位数据位,1位停止位
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFA;
TL1 = 0xFA;
PCON = 0x00;
TR1 = 1;
}
因为我们的上位机用Timer控件用于自动接收字符,所以下位机还需要个延时函数,用于在每次传输数据后稍微延时一下,否则会出现丢失数据的现象:
void DELAY_MS (unsigned int a) //毫秒级延时函数
{
unsigned int i;
while( --a != 0){
for(i = 0; i < 125; i++);
}}
这样就可以从通过串口进行测试了(以发送123为例):
void main(void)
{
StartUART(); //初始化串口
SBUF=0X2B; //发送字符“+”
DELAY_MS(20); //延时20ms
SBUF=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]。