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事件程序。
在代码窗口中输入:单片机编程器HPOOPrivate 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 IfEnd Sub'此事件会在每一个Interval属性值的循环计数间隔内被调用一次,这样就可以一直读取串口中有无数据发送。
定时器一直按设置速度循环读取串口数据。
直到串口的程序缓冲区中有数据就把他发给Text1文本框显示出来。
杭州电子元件邮购网地址:最后双击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 mEvent'' 错误Case comEventBreak '' 收到Break。
Case comEventCDTO '' CD (RLSD) 超时。
Case comEventCTSTO '' CTS Timeout。
Case comEventDSRTO '' DSR Timeout。
Case comEventFrame '' Framing ErrorCase 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 SelectEnd Sub2.轮循法采集数据:A、定时器轮循法对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。
实际上轮循法最大的好处在于集中处理数据而且不太占用CPU。
轮循法要注意定时采集的时间片段大小;这里用二进制收发模式;使属性RThreshold、SThreshold为0,屏蔽ONCOMM事件。
InputMode = comInputModeBinaryRThreshold = 0SThreshold = 0Private Sub TmrComm_Timer()''采用轮循法采集数据Dim Rx_buff() As ByteDim okstring As StringDim ReceivedLen As IntegerOn Error GoTo ErrorHandlerTmrComm.Enabled = False ''关闭定时器If commport.InBufferCount > 0 ThenReceivedLen = commport.InBufferCountRx_buff = commport.Inputokstring = StrConv(tempbyte, vbUnicode)If ReceivedLen = 6 ThenIf Chr(tempbyte(0)) = ":" And tempbyte(3) = &h0a Then....End IfIf Instr(okstring ,":@END*",vbBinaryCompare) Then....End IfEnd IfTmrComm.Enabled = True ''打开定时器End SubB、直接轮循法此法用于接收少量控制命令字;'' 保存输入子串的缓冲区Dim Instring As String'' 使用COM1。
mPort = 1'' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"'' 当输入占用时,'' 告诉控件读入整个缓冲区。
MSComm1.InputLen = 0'' 打开端口。
MSComm1.PortOpen = True'' 将attention 命令送到调制解调器。
MSComm1.Output = "A TV1Q0" & Chr$(13) '' 确保'' 调制解调器以"OK"响应。
'' 等待数据返回到串行端口。
DoDoEventsBuffer$ = Buffer$ & MSComm1.Input Loop Until InStr(Buffer$, "OK" & vbCRLF) '' 从串行端口读"OK" 响应。
'' 关闭串行端口。
MSComm1.PortOpen = False。