logo资料库

用VB编写上位机实例.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
VB 编写上位机实例 用 VB 编写上位机实例 16:14:22 UTC+0800Sun Apr 1 2007 用 VB6.0 编写第一个串口通信上位机程序 Visual Basic6.0 是一个可视化窗口环境的编程软件,目前使用 Visual Basic6.0 可以快速简单 编写单片机中的串口通信上位机程序。 电子制作 HPOO 下面我们以一个完整的通信试验为例子完成如何用 Visual Basic6.0 编写单片机串口通信程 序。 打开安装好后的 Visual Basic6.0 主程序界面。选择“标准 EXE”。如图 1 显示,建立 Visual Basic 的编程环境。 图 1 在菜单的[工程]选项中选择[部件],如图 2。把 Visual Basic 的串口通信控件 Microsoft Comm control 6.0 调入工作菜单。 图 2
在打开[部件]对话框中,选择 Microsoft Comm control 6.0 的选项框,点击[确定]。图 3 图 3 可 以 在 图 示 3 中 可 以 看 通 信 控 件 Microsoft Comm control 6.0 的 文 件 是 在 C:\WINNT\system32\MSCOMM32.OCX 文件。 如果大家在首次调用通信控件 Microsoft Comm control 6.0 控件时无法在控件对话框中找到, 请直接在系统目录中搜索名为 MSCOMM32.OCX 文件。然后通过浏览加入 VB 的工作界面 中。添加完控件回到编程界面。如下图 4。 图 4 通过右边的菜单把一些必要的控件放在窗体中。然后点击窗体中的 Timer 控件按 F4 弹出属 性窗口进行设置。其具体设置如下:
Timer 定时器控件设置属性,(通过按 F4 键可弹出此窗口) Mscomm 通信控件参数属性设置(通过单击控件的右键属性可弹出此窗口) 本文用到的其他控件:CommandButton 控件和 TextBox 控件按默认属性设置不变。 单片机 编程器 HPOO 以上设置完成,回到编程窗体区中,任意双击。会显示 Visual Basic 的程序窗体的 Load 事 件程序。在代码窗口中输入: 单片机编程器 HPOO Private Sub Form_Load() MSComm1.PortOpen = True '窗体的加载时,就打开通信端口,通信端口的参数也可以在此指定 Timer1.Enabled = Timer1.Enabled '窗体的加载时,同时定时器控件事件 End Sub 这样设置目的是当程序在打开是,首先打开通信控件 MSComm,注意这里的串口通信参数 中的波特率设置是默认参数的。 即:波特率:9600bps;校验位:无;数据位:8 位;停止位:1。 电子元件邮购网 双击定时器控件 Timer1 同样在定时器窗体的事件程序中,输入相关代码: Private Sub Timer1_Timer() If MSComm1.InBufferCount > 0 Then '程序检查输入缓冲区中是否有数据,若有数据 Text1.Text = Text1.Text + MSComm1.Input
'则将此数据读取后,指定给文本框的 Text 属性 End If End Sub '此事件会在每一个 Interval 属性值的循环计数间隔内被调用一次,这样就可以一直读取串口 中有无数据发送。定时器一直按设置速度循环读取串口数据。直到串口的程序缓冲区中有数 据就把他发给 Text1 文本框显示出来。 杭州电子元件邮购网地址:www.hpoo.net 最后双击 CommandButton 控件 ,在弹出的程序窗口事件中输入如下代码: Private Sub Command1_Click() MSComm1.PortOpen = False '关闭通信端口 End '结束系统 End Sub 在这个窗口中 MSComm1.PortOpen = False 是当程序停止或者关闭软件时都应该加上关闭串 口。通过以上简单的代码就实现了 VB 串口接收程序。编辑完成后,我们通过 Visual Basic 菜单[文件]中的编译来生产可执行文件。如下图:
这样就产生完成程序整个步骤工作。下面将介绍通过单片机编程实现串口发送数据到上位机 程序的窗口中显示出来。同时通过 PROTEUS 仿真软件的示波器来查看串口数据发送情况。 MSCOMM 串口控件数据接收方式: 1、 在 OnComm 事件中接收数据: 这种方式能充分 MSCOMM 控件的特性。OnComm 事件还可以检查和处理通讯错误; 可以通过检查 CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行 处理比较复杂的情况,此法不是很方便。 Private Sub MSComm_OnComm () Select Case MSComm1.CommEvent '' 错误 Case comEventBreak '' 收到 Break。 Case comEventCDTO '' CD (RLSD) 超时。 Case comEventCTSTO '' CTS Timeout。 Case comEventDSRTO '' DSR Timeout。 Case comEventFrame '' Framing Error Case comEventOverrun ''数据丢失。 Case comEventRxOver''接收缓冲区溢出。 Case comEventRxParity'' Parity 错误。 Case comEventTxFull ''传输缓冲区已满。 Case comEventDCB ''获取 DCB] 时意外错误 '' 事件 Case comEvCD '' CD 线状态变化。
Case comEvCTS '' CTS 线状态变化。 Case comEvDSR '' DSR 线状态变化。 Case comEvRing '' Ring Indicator 变化。 Case comEvReceive '' 收到 RThreshold # of chars. Case comEvSend '' 传输缓冲区有 Sthreshold 个字符 '' Case comEvEof '' 输入数据流中发现 EOF 字符 End Select End Sub 2.轮循法采集数据: A、定时器轮循法 对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。实际上轮循法最大 的好处在于集中处理数据而且不太占用 CPU。轮循法要注意定时采集的时间片段大小;这 里用二进制收发模式;使属性 RThreshold、SThreshold 为 0,屏蔽 ONCOMM 事件。 InputMode = comInputModeBinary RThreshold = 0 SThreshold = 0 Private Sub TmrComm_Timer() ''采用轮循法采集数据 Dim Rx_buff() As Byte Dim okstring As String Dim ReceivedLen As Integer On Error GoTo ErrorHandler TmrComm.Enabled = False ''关闭定时器 If commport.InBufferCount > 0 Then ReceivedLen = commport.InBufferCount Rx_buff = commport.Input okstring = StrConv(tempbyte, vbUnicode) If ReceivedLen = 6 Then If Chr(tempbyte(0)) = ":" And tempbyte(3) = &h0a Then .... End If If Instr(okstring ,":@END*",vbBinaryCompare) Then .... End If End If TmrComm.Enabled = True ''打开定时器 End Sub B、直接轮循法 此法用于接收少量控制命令字; '' 保存输入子串的缓冲区 Dim Instring As String '' 使用 COM1。 MSComm1.CommPort = 1 '' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1" '' 当输入占用时, '' 告诉控件读入整个缓冲区。 MSComm1.InputLen = 0 '' 打开端口。 MSComm1.PortOpen = True '' 将 attention 命令送到调制解调器。 MSComm1.Output = "ATV1Q0" & Chr$(13) '' 确保 '' 调制解调器以"OK"响应。 '' 等待数据返回到串行端口。 Do DoEvents Buffer$ = Buffer$ & MSComm1.Input Loop Until InStr(Buffer$, "OK" & vbCRLF) '' 从串行端口读 "OK" 响应。 '' 关闭串行端口。 MSComm1.PortOpen = False
分享到:
收藏