vb实现多通道串口采集
- 格式:doc
- 大小:23.98 KB
- 文档页数:15
利用VB实现串口数据采集
于大方
【期刊名称】《山东广播电视大学学报》
【年(卷),期】2002(000)003
【摘要】本文给出了工业数据采集的常见模式,给出了具体连接示意图,同时提出了一种通过RS485方式、利用VB实现作为主方式微机的一个串口对多个从方式的不同种类串行设备的快速通信算法.
【总页数】2页(P60-61)
【作者】于大方
【作者单位】青岛广播电视大学,山东,青岛,266000
【正文语种】中文
【中图分类】TP274
【相关文献】
1.利用VB实现串口通讯在水工闸门远程控制系统中的应用 [J], 茹世荣;汪丹
2.利用VB串口通讯实现对滚珠丝杠磨削误差控制的研究 [J], 刘剑
3.基于VB 6.0串口通信的气压测高系统数据采集实现 [J], 王晓岚
4.利用VB实现计算机与单片机的串口通信 [J], 柴学宁
5.利用VB实现PC机对PRAC5210锁相放大器的串口通讯控制设计 [J], 周章渝;吴次南;董昌文
因版权原因,仅展示原文概要,查看原文内容请购买。
的文件材料的收集、整理、移交工作;二要对施工单位文件材料的形成情况进行质量检查把关,按照监理规程要求,在控制节点进行审核、签署,发现问题及时提出整改。
建设单位:全面负责立项文件、建设用地征地拆迁文件、勘察、测绘、设计文件,工程招投标文件、开工审批文件、财务文件的形成和归档。
为确保项目竣工验收,建议前期组织人员调研项目档案验收程序,明确重点验收范围,编制档案验收文件汇总目录,分项落实到部门和相关人员,负责完整、准确形成档案资料和及时归档。
5结论是否可以与越来越复杂的建井条件挂钩:在复杂条件下,为便于开展工程评价,并为后继工程提供借鉴,对档案管理的要求在提高,原有的档案管理模式不能满足这一要求,在项目档案管理出现管理难度大,形成难,归档难,案卷整理组巻难的问题。
因此,建议在在矿井工程建设各方中增设档案管理人员,分施工单位、监理单位、建设单位三个层面进行控制归档。
个人简介孙洪章(1963~),男,高级工程师,1986年毕业于阜新矿业学院,现在兖煤菏泽能化有限公司从事矿建工作。
(收稿日期:2008-9-19)用VB编写RS-485数据采集程序昆明理工大学国土资源工程学院张明旭黄德镛现场总线和智能仪表的出现标志着工业控制领域进入了网络时代,迅速成为了工业控制的主流。
目前国际上正在使用的现场总线名目繁多,如PROFIBUS、INTERBUS、CAN总线,但是其系统造价相对较高,不太适用于中小型系统的应用。
而RS485串行通信总线以构造简单、技术成熟、造价低廉、便于维护等特点广泛应用于工业控制、仪器、仪表、机电一体化产品等诸多领域。
尤其在数据通信、计算机网络以及工业分布式控制系统中,经常需要采用串行通信来实现远程信息交换。
但是为了对控制串行网络远程采集数据,依然需要为串行通讯网络和智能仪表编写数据采集程序。
本文就简单介绍一个适应RS-485串行网络的数据采集程序。
1RS-485简述电子工业协会EIA于1983年制订并发布RS-485标准,并经TIA-通讯工业协会修订后命名为TIA/EIA-485-A,习惯地称之为RS-485。
图1烘炉温度多路数据采集系统上位机软件界面基于VB 的多路数据采集系统上位机软件设计张瑜,韩玉杰,闵昆龙(东北林业大学机电工程学院,黑龙江哈尔滨150040摘要:采用Visual Basic 6.0设计多路数据采集系统的上位机软件,实现对由单片机组成的测量系统数据的采集、传输、保存、分析、绘制曲线图以及数据和曲线图的打印。
文中以烘炉内多点温度数据采集系统设计为例说明用于串口通信上、下位机的软件设计,以及VB 中mscomm ,msflexgrid 等控件的用法。
关键词:多路数据采集;上位机;mscomm 控件;msflexgrid 控件中图分类号:TP311文献标识码:A文章编号:1001-4462(200701-0029-02Software Design in Host Computer of Multi-data AcquisitionSystem Based on VBZHANG Yu,HAN Yu-jie,MIN Kun-long(College of Machinery and Electricity of Northeast ForestryUniversity ,Heilongjiang Harbin 150040,ChinaAbstract :This article mainly explained how to design software for host computer of multi-data acquisition system based on visual basic 6.0.Also it displaied that the whole single-chip system how to acquire,communicate,save and analyze the data,how to draw graph,and how to print data and graph.The test taked the oven ’s multi-temperature data acquisition system for example,expounded the design of software of host and slave computer that using for serial communication,and also explained the mscomm control and msflexgrid control of visual basic.Key words :multi-data acquisition;host computer;mscomm control;msflexgrid control微软公司的visual basic 6.0是windows 应用程序开发工具,是目前应用最为广泛、易学易用的面向对象的开发工具,并且为用户提供了大量的控件。
串口数据采集及曲线动态显示这个程序主要用到了串口通信和曲线画图一.主要控件Msomm控件一个,两个timer控件,textbox控件,combo控件,picture控件,command 控件二.实现的功能能1.串口采集数据2.用曲线动态显示数据3. 显示时间4.鼠标点击读数(确定所点击位置的横纵坐标)三.界面四.程序Dim T As VariantDim c As VariantDim Y As IntegerPrivate Declare Sub Sleep Lib "kernel32 " (ByVal dwMilliseconds As Long) 'API,用sleep实现延时'延时函数Function delay(number)Call Sleep(number)DoEventsEnd FunctionPrivate Sub Combo1_Click() '选择端口If Combo1.Text = "COM1" ThenmPort = 1ElseIf Combo1.Text = "COM2" ThenElseIf Combo1.Text = "COM3" ThenmPort = 3ElseIf Combo1.Text = "COM4" ThenmPort = 4ElsemPort = 5End IfEnd SubPrivate Sub Command3_Click() '停止采集Timer2.Enabled = FalseMSComm1.PortOpen = FalseCommand2.Caption = "打开串口"End SubPrivate Sub Form_Load() '初始化MSComm1.Settings = "9600,N,8,1"MSComm1.InputMode = 0MSComm1.RThreshold = 1MSComm1.SThreshold = 0MSComm1.InBufferSize = 1024MSComm1.OutBufferSize = 512MSComm1.InBufferCount = 0MSComm1.OutBufferCount = 0Combo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Picture1.Scale (-100, 100)-(100, -100)Command1.Caption = "采集数据"Command2.Caption = "打开串口"Timer1.Interval = 1000Timer2.Interval = 1000Timer2.Enabled = FalseEnd SubPrivate Sub Command2_Click()If Command2.Caption = "打开串口" ThenMSComm1.PortOpen = TrueCommand2.Caption = "关闭串口"ElseIf Command2.Caption = "关闭串口" ThenCommand2.Caption = "打开串口"End IfEnd SubPrivate Sub MSComm1_OnComm() '触发事件If MSComm1.InBufferCount > 0 ThenText4.Text = MSComm1.Inputc = Val(Text4.Text)delay (20)End IfEnd SubPrivate Sub draw()Picture1.FontSize = "15" '设置字体大小Picture1.DrawWidth = 1Picture1.ForeColor = QBColor(12)Picture1.ClsPicture1.Line (-88, -88)-(-88, 88) '纵坐标Picture1.Line (-89, 86)-(-88, 88) '纵坐标箭头及y值Picture1.Line (-87, 86)-(-88, 88)Picture1.PSet (-86, 88)Picture1.Print "y"Picture1.Line (-88, 0)-(88, 0) '横坐标Picture1.Line (86, 1)-(88, 0) '横坐标箭头及x值Picture1.Line (86, -2)-(88, 0)Picture1.PSet (88, -1)Picture1.Print "x"Picture1.DrawWidth = 4Picture1.FontSize = 8For Y = -80 To 80 Step 10Picture1.PSet (-88, Y)Picture1.Print (Y)Next YT = -88Timer2.Enabled = TrueEnd SubPrivate Sub Picture1_MouseDOWN(Button As Integer, Shift As Integer, B As Single, A As Single) '"光标线读数"Text1.Text = BText2.Text = AEnd SubPrivate Sub Command1_Click() '开始采集Call drawEnd SubPrivate Sub Timer2_Timer() '画图Picture1.DrawWidth = 1Picture1.PSet (T, c), vbGreenT = T + 0.5If T > 88 ThenCall drawEnd IfEnd SubPrivate Sub Timer1_Timer() '显示时间Text3.Text = CStr(Time$())End Sub。
VB三种读取串口数据的方式3三种读取串口数据的方式vb提供的这个通信控件“隐藏”了大部分串口通信的底层运行过程,程序员只需编写少量的代码就可以完成软件的开发过程。
在通信数据量不大,通信要求不是很高的情况下建议采取此方式。
(1)settings属性:以字符串的形式设置并回到波特率、奇偶校验位、数据位、暂停位。
这个属性很关键,针对相同的终端设备须要根据设备的具体情况展开调整(比如说日本的设备不同于美国的设备,通常可以使用奇校验)。
(2)inputmode属性:设置接收数据的类型,0为文本格式,1为二进制格式。
(3)input属性:读取并删除接收缓冲区中的数据流。
(4)output属性:向发送缓冲区传送一数据流。
(6)handshaking属性:设置和回到击掌协议,即为计算机内部cpu与串口之间的通讯协议,确保在缓冲区负载时数据不能遗失。
这个属性在确保数据传输的正确性方面存有非常大的促进作用,共计四个选项,分别则表示:①并无流控制;②软件流控制;③硬件流控制;④软硬件流控制。
使用硬件流控时,建议串口之间和电缆积极支持硬件击掌,在自己制作串口通信线时,有关硬件击掌的线rts、cts、dsr、dtr必须相连接恰当。
在正确设置这些属性的基础上,剩下的就是打开串口,通过串口发送及接受数据了。
本文后续章节利用一个实例详细讲解了这些属性的设置及具体代码。
3.2轻易调用win32api通信函数直接调用windowsapi函数,可以清楚地理解串口通信的机制,根据需要灵活地配置串口的各种参数和属性,而且直接调用低层api函数,通信效率比较高,但付出的代价就是程序较复杂,编程周期长,适合于大型通信程序及通讯质量要求较高的场合。
在32位的windows系统中,串口通信就是做为文件处置的,串口操作方式通常为关上、停用、加载、载入等操作方式,适当的windowsapi函数如下:[4](1)createfile()函数:实现串口的初始化并打开串口,返回串口句柄资源以供后续进程调用。
基于串行口的数据采集系统的设计摘要:数据采集在日常生活中有着广泛的应用,特别是在一些对数据的准确性,实时性要求比较高的场合,需要设计专用的电路来实现系统的需求,而系统的功能的实现,与我们对元器件的选型,设计搭建的电路有直接的关系,它们直接影响着系统对外界环境的感知和响应能力,决定着系统的性能。
数据采集在工业控制领域有着广泛的需求,本设计是实现基于串行口的数据采集系统,以采集周围的环境温度为采集对象,以STC89C51单片机作为下位机,以PC机作为上位机,使用9针串口来实现下位机和上位机的通讯。
通过在PC机上使用VB6.0开发软件来开发实现数据接收显示控制界面。
系统调试结果表明,该系统设计合理,对周边环境温度的变化反应敏感,数据采集的波特率达到9600bps.关键字:数据采集系统、STC89C51单片机、串口通信、VB中图分类号:TP2IDesign of Data Acquisition System Base on SerialCommunicationABSTRACT: Data collection is widely applied in daily life, especially in the place which is very high request in data accuracy, real time display. A special circuit is need to be designed to realize it. Also, it have much connection with the sensor and circuit design , they influence the system’s sensor and response ability very much , it directly determined the system’s character.Nowadays, Data collection is widely requested in the industry control area. The system is designed to realize the data acquisition according to the serial port , collecting the temperature around the environment as collection object , use STC89C51 single-chip microcomputer as down machine , use personal computer as upper machine , use 9 pin serial port to realize the down SCM and upper PC’s communication . A display control form was made use the VB6.0 software . The experiment have done display that , the design was reasonable , it was very sensitive to the temperature’s ch ange around the environment .The system’s data collection speed could arrived to 9600bps.关键词:data collection system;STC89C51 single-chip microcomputer;serial communication;Visual Basic中图分类号:TP2II目次摘要 (I)ABSTRACT (II)目次 .......................................................................................................................................I II 1绪论. (1)1.1研究的背景和意义 (1)1.2数据采集系统的研究现状 (1)1.3研究思路和方法比较 (2)1.4本章小结 (3)2 基于串行口的数据采集系统的总体设计与分析 (4)2.1 基于串行口的数据采集系统的总体设计思想 (4)2.2 设计方案与论证 (4)2.3 本章小结 (5)3 下位机的设计 (6)3.1传感器的选择 (6)3.2 TTL与RS232电平的转换 (7)3.3单片机电路设计 (8)3.4系统总的电路设计实现 (8)3.5本章小结 (10)4 上位机的设计 (11)4.1 Visual Basic设计介绍 (11)4.2 Visual Basic 设计实现 (12)III4.3 本章小结 (13)5 系统结果和分析 (14)5.1 实验调试与结果 (14)5.2 本章小结 (18)6总结 (19)参考文献 (20)附录(下位机实现程序代码) (21)个人简历 (22)学位论文数据集 (23)IV1 绪论1.1 研究的背景和意义在计算机广泛应用的今天,数据采集在很多领域有着十分重要的应用。
VB串口通信数据采集2009-05-12 18:40前两天受人之托写的一个程序,发上来共享,从中可以看到串口通信的常用处理方式,希望对大家有所帮助。
一、系统需求:使用三线制串口,利用vb与dsp通信,采集数据并存储为文本文件。
二、通信协议1. RS232串行通信的波特率设为9600,8位数据位,一位停止位,无校验位。
2. 每组数据包含T1(16位)和T2(16位),将每个数据分成2个8位的数据,先是低8位,然后是高8位。
数据为无符号整型。
先发T1,然后发T2,然后是下一组T1、T2。
T1以头数据0x0A(16进制,10进制位10)为头字节,然后是T1的低8位,T1的高8位。
T2以头数据0xA0(16进制,10进制位160)为头字节,然后是T2的低8位,T2的高8位。
发送时序举例:0x0A, t1低8位,t1高8位,0xA0, t2低8位,t2高8位……将收到的数据T1、T2的高低8位合并,转换成10进制数,以每行T1 T2的形式存储到txt文本文件中。
三、要点说明0. 如果通信协议没有考虑周全就着手开始做,可能会经受无比的痛苦1. 文本框textbox的大小限制为32k,不符合大量数据的需要,因此使用richtextbox2. 换行符为Chr(&HD) + Chr(&HA)3. 需要用状态栏给出必要的信息4. 保存文件的默认名字为当前日期5. 收到comm事件后,需要关闭com事件接收,避免再次触发事件Dim av As VariantDim datacount As LongPrivate Sub cmdClear_Click()txtData.Text = ""End SubPrivate Sub cmdStop_Click()'关闭端口If MSComm.PortOpen = True ThenMSComm.InBufferCount = 0 '清空缓冲区MSComm.PortOpen = FalseEnd IfcmdReceive.Enabled = TruelblStatus.Caption = "停止接收,空闲"End SubPrivate Sub cmdReceive_Click()'串口设置With MSComm.CommPort = 1.Settings = "9600,N,8,1".RThreshold = 1 '接收1字节触发oncomm事件.InputMode = comInputModeBinary.InputLen = 1 '输入长度为1.InBufferCount = 0 '清除接收缓冲区End With'打开端口If MSComm.PortOpen = False ThenMSComm.PortOpen = TrueIf Err ThenMsgBox (Err.Description)Exit SubEnd IfEnd IflblStatus.Caption = "打开端口,等待接收" datacount = 0cmdReceive.Enabled = FalseEnd SubPrivate Sub cmdSave_Click()Dim outfn As StringMsgBox ("接收了" + CStr(datacount) + "组数据") lblStatus.Caption = "接收完成,请选择输出文件"cmdReceive.Enabled = True'选择输出文件CommonDialog1.FileName = CStr(Date) + ".txt"CommonDialog1.Filter = "Text Files|*.txt"CommonDialog1.Flags = CommonDialog1.Flags Or cdlOFNOverwritePrompt CommonDialog1.CancelError = TrueOn Error GoTo errhandlerCommonDialog1.ShowSaveoutfn = CommonDialog1.FileNameOpen outfn For Output As #1Print #1, txtData.TextClose #1'txtData.SaveFile outfnlblStatus.Caption = "输出完成,空闲"errhandler:Exit SubEnd SubPrivate Sub Form_Load()lblStatus.Caption = "空闲"End SubPrivate Sub Form_Unload(Cancel As Integer)'关闭端口If MSComm.PortOpen = True ThenMSComm.InBufferCount = 0 '清空缓冲区MSComm.PortOpen = FalseEnd IfEnd SubPrivate Sub MSComm_OnComm()Dim T1, T2 As LongSelect Case mEventCase comEvReceive '收到Rthreshold个字节产生的接收事件MSComm.RThreshold = 0 '关闭OnComm事件接收lblStatus.Caption = "接收"av = MSComm.Input '读取一个接收字节dataframe(1) = av(0) '转换为字节If dataframe(1) = &HA Then '接收到T1DoDoEventsLoop Until MSComm.InBufferCount >= 2 '循环等待接收缓冲区>=2个字节av = MSComm.Inputdataframe(2) = av(0)av = MSComm.Inputdataframe(3) = av(0) '接收T1T1 = dataframe(2) + CLng(dataframe(3)) * 256 '计算T1End IfDoDoEventsLoop Until MSComm.InBufferCount >= 1 '循环等待接收缓冲区>=1个字节av = MSComm.Input '读取一个接收字节dataframe(4) = av(0) '转换为字节'接收到T2If dataframe(4) = &HA0 Then'MSComm.RThreshold = 0 '关闭OnComm事件接收'循环等待接收缓冲区>=2个字节DoDoEventsLoop Until MSComm.InBufferCount >= 2av = MSComm.Inputdataframe(5) = av(0)av = MSComm.Inputdataframe(6) = av(0) '接收T2T2 = dataframe(5) + CLng(dataframe(6)) * 256 '计算T2'显示T1 T2 entertxtData.Text = txtData.Text + CStr(T1) + " " + CStr(T2) + Chr(&HD) + Chr(&HA)datacount = datacount + 1 '数据组数+1End IfMSComm.RThreshold = 1 '打开OnComm事件接收Case ElseEnd SelectEnd Sub。
利⽤SerialPort进⾏读取串⼝操作Imports SystemImports System.IO.PortsPublic Class Form1Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '获取计算机有效串⼝Dim ports As String() = SerialPort.GetPortNames() '必须⽤命名空间,⽤SerialPort,获取计算机的有效串⼝Dim port As StringFor Each port In portsportnamebox.Items.Add(port) '向combobox中添加项Next port'初始化界⾯baudratebox.SelectedIndex() = 2portnamebox.SelectedIndex() = 0Serial_Port1() '初始化串⼝Label3.Text = SerialPort1.IsOpenstatuslabel.Text = "串⼝未连接"statuslabel.ForeColor = Color.Redsendbox.Text = "123"' baudratebox.Text = baudratebox.Items(0) 注释和不注释的地⽅可以替换'portnamebox.Text = portnamebox.Items(0)End SubPrivate Sub Serial_Port1() '设置串⼝参数SerialPort1.BaudRate = Val(baudratebox.Text) '波特率SerialPort1.PortName = portnamebox.Text '串⼝名称SerialPort1.DataBits = 8 '数据位SerialPort1.StopBits = IO.Ports.StopBits.One '停⽌位SerialPort1.Parity = IO.Ports.Parity.None '校验位End Sub'关闭串⼝连接Private Sub closebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closebtn.Click TrySerialPort1.Close() '关闭串⼝Label3.Text = SerialPort1.IsOpenIf SerialPort1.IsOpen = False Thenstatuslabel.Text = "串⼝未连接"statuslabel.ForeColor = Color.Redreceivebox.Text = ""receivebytes.Text = ""End IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'打开串⼝连接Private Sub openbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openbtn.Click TrySerialPort1.Open() '打开串⼝Label3.Text = SerialPort1.IsOpenIf SerialPort1.IsOpen = True Thenstatuslabel.Text = "串⼝已连接"statuslabel.ForeColor = Color.GreenEnd IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'发送数据Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TrySerialPort1.Write(sendbox.Text)Catch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'触发接收事件Public Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceivedMe.Invoke(New EventHandler(AddressOf Sp_Receiving)) '调⽤接收数据函数End Sub'接收数据Private Sub Sp_Receiving(ByVal sender As Object, ByVal e As EventArgs)Dim strIncoming As StringTryreceivebytes.Text = Str(Val(receivebytes.Text) + SerialPort1.BytesToRead)If SerialPort1.BytesToRead > 0 ThenThreading.Thread.Sleep(100) '添加的延时strIncoming = SerialPort1.ReadExisting.ToString '读取缓冲区中的数据SerialPort1.DiscardInBuffer()receivebox.Text = strIncomingEnd IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd SubEnd Class。
VB中串口通讯的实现VB中串口通讯的实现一、概述串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。
提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。
实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB 中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。
下面,笔者就介绍一下在VB中实现串口通讯的方法。
在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。
我们只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
下面,笔者就简要地介绍一下MSComm控件的使用方法。
二、MSComm控件的主要属性、事件1、MSComm的属性由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。
Commport:设置通讯所占用的串口号。
如设成1(默认值),表示对Com1进行操作。
Setting:对串口通讯的相关参数。
包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。
其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。
Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。
Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。
Ouput:发送数据到输出寄存器。
InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。
InputMode:设置从输入寄存器中读取数据的形式。
若值为0,则表示以文本形式读取;值为1,则表示以二进制形式读取。
OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。
基于VB6.0的多路数据采集与处理系统祁建广1,李宝营2,孙玉明2(大连工业大学 信息科学与工程学院, 辽宁 大连 116034)摘要:针对在生产过程中对现场工艺参数采集、记录不及时的问题,设计了基于VB6.0的包括硬件电路及软件编程的多路数据采集与处理系统。
系统实现了上下位机的通信和对系统管理界面进行设计,可更直观地观察数据,更便捷地对系统进行控制。
关键词:单片机;串行通信;数据采集;VB6.0中图分类号:TP368.1 文献标识码:AThe system of multi-channel of acquisition and treatment of temperaturebased on VB 6.0QI Jian-guang, LI Bao-ying ,Sun Yu-ming( School of Information Science & Engineering, Dalian Polytechnic University, Dalian 116034, China )Abstract :In order to gather and record on-site technical parameters in the production process in a timely manner, multi-channel data acquisition and process system was designed based on VB6.0. This system can acquire and tackl data, communicate between the lower position machine and the higher position machine, and make people design system management interface. These functions can allow people to observe the data more intuitively and to control the system more efficiently.Key words: Microcontroller unit; Serial communication; Data acquisition ;VB6.00引言对工业现场物理参数的采集较为流行的是采用PLC 数据采集系统或者单片机数据采集系统[1],该系统优点是可靠性高,缺点是不能实现远距离监视参数变化情况。
VB中串口通讯的实现详解说明在VB中实现串口通讯可以分为以下几个步骤:1.引用串口通讯相关的命名空间首先在项目中引用System.IO.Ports命名空间,该命名空间包含了实现串口通讯所需的类和方法。
2.创建串口对象使用SerialPort类创建一个串口实例,可以指定串口的名称、波特率、数据位、停止位、校验位等参数。
```vbDim serialPort As New SerialPortserialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.StopBits = StopBits.OneserialPort.Parity = Parity.None```3.打开串口使用Open方法打开串口,可以在Open之前先判断串口是否已经打开。
```vbIf serialPort.IsOpen Then'串口已经打开ElseserialPort.OpenEnd If```4.串口数据接收通过事件处理函数来处理串口接收到的数据。
可以使用DataReceived事件来处理数据接收,当串口接收到数据时会触发该事件。
```vbPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim data As String = serialPort.ReadExisting'处理接收到的数据End Sub```5.串口数据发送通过串口的Write方法来发送数据。
```vbserialPort.Write("Hello World")```需要注意的是,串口通讯是一种异步操作,发送和接收数据都需要一定的时间,因此在程序中需要合理处理串口的状态。
1 / 17用VB开发多通道仪表数据采集程序(xxxx)1.前言实时数据采集系统过去在DOS操作系统下一般是采用汇编语言开发制作。
随着Windows操作系统的普及应用,数据采集及工业控制等软件的开发也上升到Windows环境下。
可视化软件开发平台的出现,为软件开发提供了强大的图形界面功能,使得开发出来的各种应用软件具有良好的人机交互功能。
汇编语言的特点是功能强、运行速度快,但编程复杂、调试难,而高级语言具有良好的可读性及方便的调试手段。
Visual Basic是Windows环境下简单、易学、高效的可视化编程语言开发系统,以其所见即所得的可视化界面设计风格和32位面向对象的程序设计等特点,已广泛地应用于各个领域,是很多计算机软件开发人员采用的开发工具。
VB不但提供了良好的界面设计能力,而且在微机串口通信方面也有很强的功能。
采用VB开发Winodws下的数据采集和工业控制应用软件十分方便,尤其软件界面设计非常便捷,编程工作量较小,开发周期短,特别适合非计算机专业的工程技术人员掌握和使用。
2.MSComm控件特点MSComm控件是Microsoft提供的扩展控件,用于支持VB程序对串口的访问,该控制“隐藏”了大部分串口通讯的底层运行过程和许多烦琐的处理过程,同时支持查询方法和事件驱动通讯的机制,事件驱动通讯是交互方式处理串口事务的一种非常有效的方法,特别适合Windows程序的编写。
在串口通讯过程中,当发送数据、收到数据或产生传输错误时,触发MSComm控件的OnComm事件,然后可以通过判断CommEvent属性值获得事件类型,再根据事件类型进行相应数据处理。
因此用其实现微机串口的数据通讯相当简单,以很少的程序代码就可以轻松实现串口的访问和数据通讯。
2 / 173.实时数据采集示例程序下面给出的应用实例,通过对一台工业八通道实时检测仪表数据通讯协议进行分析,利用VB6.0开发微机通过串口对多通道工业仪表进行实时数据采集的编程技术。
给出的程序代码具有通用性,并有详示,可以直接或稍加改动后用于其它数据采集或实时控制程序中。
3.1仪表及其数据通讯协议这台工业用八通道实时检测仪表,最多可同时接八路高精度位移传感器,用于测量多点微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。
该仪表带有一个9针的RS-232C串口,能与微机进行串口数据通讯,实时传送检测数据,通过微机软件处理可实现工业实时监控。
该仪表的串口数据通讯协议是:数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。
仪表每秒通过串口发送200个字节数据,由于接入的位移传感器数量在1-8路可调,所以发送的每帧数据长度不定长,随传感器数量多少而变化。
仪表数据传输首先发送每帧数据的开始标志字节,该字节定义为二进制常数0FAH;然后发送1个字节的通道状态字节,该字节按位顺序每位代表相应的一路通道状态,某位是1则代表该通道接有位移传感器,某位是0则代表该通道未接位移传感器;从第三个字节开始按位移传感器接通的通道顺序发送采集数据字节,每道数据有三个字节,前2个数据字节采用压缩的BCD码编码方式,第1个数据字节是高位,第2个数据字节是低位,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第3个数据字节为符号字节,该字节第八位为1,即1xxxx 则为负数,第八位为0,即0xxxx则为正数。
例如发送的字节数据为:0FAH 0B1H 26H 87H 8H 34H 62H 00H 37H 76H 0H 42H 53H 80H0FAH为帧开始标志字节,第一道,第五道,第六道,第八道接有位移传感器,表示-3 / 1726.87 34.6237.76-42.53。
3.2部分参数的技术分析3.2.1仪表通讯传输速率为9600bps,则最快速度为1.0417ms发送一个字节;仪表每秒发送200个字节,平均5.0ms发送一个字节,在查询方式或连续读取串口数据时要在程序中添加循环等待程序,等待接收缓冲区收到足够的字节才能进行数据处理。
3.2.2仪表发送每帧数据长度不定长,为了实现实时监测功能,接收数据的读取要尽可能的快速,则在程序开始运行时设置MSComm1的属性RThreshold = 26接收缓冲区收到26个字节产生OnComm事件InputLen = 1 Input每次读取一个字节等到程序接收到一帧完整数据后,计算出当前帧数据长度,再将Rthreshold属性修改为帧长度,则接收缓冲区在收到一帧数据后,MSComm控件才会触发一个OnComm事件,这样就会有更多的时间进行数据的计算和处理。
3.2.3仪表每秒发送200个字节数据,微机收到一完整帧数据至少需要t(ms)时间(只接一道传感器t=25ms;接八道传感器t=130ms),然后再进行数据处理。
如果微机在下一帧数据接收前即t ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>=一完整帧长度),这时完全可以实现实时监测或实时控制;如果微机在t ms内不能将数据计算处理完毕,接收缓冲区设置的又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,4 / 17固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情况下接收缓冲区的大小就会影响实时监测效果,所以接收缓冲区设置不能过大,让部分数据丢失,以保证数据处理的实时性。
3.2.4设置MSComm控件的接收数据模式采用二进制方式,即3.2.5VB中有Byte类型变量,但没有字节的位处理语句。
通道状态字节的位处理要通过对该字节的值运算进行判断,符号字节的位处理则要判断符号字节的值是否大于127,大于127则为负数;压缩的BCD码存入Byte类型变量,VB系统只按十进制数处理,这要通过一个简单算法换算,解压BCD码才能还原成十进制表示数值。
假如a是Byte类型变量,W是Single类型变量,将一个压缩的BCD码存入a中,则算法是:W=(a\16)*10 + a-(a\16)*16 则W=a-(a\16)*6 3.3程序代码在(通用)(声明)中定义程序所用变量:Dim ab(4) As Byte注释:字节数据类型数组,用来存贮接收到的一组字节数据Dim av As Variant注释:用来从接收缓冲区读取数据Dim i As Integer Dim j As Integer Dim w As Integer注释:5 / 17接收数据个数计数器Dim b1 As Single Dim b2 As Single Dim WW As Single注释:十进制检测值Dim TD(8) as Boolean注释:通道状态数组Dim Wmax (8) As Single注释:最大值数组Dim Wmin (8) As Single注释:最小值数组在窗体中添加名为Command1的[开始]按钮和名为MSComm1的MSComm控件。
[开始]按钮的Click事件处理程序主要是对MSComm1控制的参数初始化设置,程序中大部分参数在设计时可在MSComm1控制的属性窗口中设置:Private Sub Command1_Click()注释:开始按钮With MSComm1 .CommPort=2注释:6 / 17使用COM2.Setting=9600,N,8,1注释:设置通信口参数.InBufferSize=40注释:设置MSComm1接收缓冲区为40字节.OutBufferSize=2注释:设置MSComm1发送缓冲区为2字节设置接收数据模式为二进制形式.InputLen = 1注释:设置Input一次从接收缓冲读取字节数为1.SThreshold = 1注释:设置Output一次从发送缓冲读取字节数为1 .InBufferCount = 0注释:清除接收缓冲区.OutBufferCount = 0注释:清除发送缓冲区For i=1 to 8Wmax(i) = -99注释:最大值赋初值Wmin(i) = 99注释:最小值赋初值Next i7 / 17w = 0注释:数据个数计数器清零.RThreshold = 1注释:设置接收一个字节产生OnComm事件On Error Resume Next注释:改变错误处理的方式。
Err.ClearIf .PortOpen = False Then注释:判断通信口是否打开.PortOpen = True注释:打开通信口If Err Then注释:错误处理MsgBox 串口通信无效Exit Sub End If End If End With End Sub为了达到实时数据采集目的,实时数据采集处理程序采用MSComm事件驱动方式。
8 / 17Private Sub MSComm1_OnComm() With MSComm1Select Case .CommEvent注释:判断MSComm1通讯事件收到Rthreshold个字节产生的接收事件av = .Input注释:读取一个接收字节ab (1) = av (0)注释:转换保存到字节数据类型数组If ab(1) = 170 Then注释:判断是否为数据开始标志,0FAH=170 .RThreshold = 0注释:关闭OnComm事件接收W=W+1注释:计数器加1 av = .Input注释:读取通道状态字节ab9 / 17(0) = av (0)注释:转换保存到字节数据类型数For i = 1 To 8注释:通道状态数组复位TD(i) = False Next i帧长度赋初值,一个开始字,一个状态字If ab (0) >= 128 Then 注释:判断第八通状态TD (8) = True ab (0) = ab (0) - 128 End If If ab(0) >= 64 Then TD (7) = True ab10 / 17(0) = ab (0) - 64 End If If ab(0) >= 32 Then TD (6) = True ab (0) = ab (0) - 32 End If If ab (0) >= 16 Then TD (5) = True ab (0) = ab (0) - 16注释:第八道是真注释:第7位置零11 / 17注释:帧xx加3个字节注释:判断第七通状态注释:第七道是真注释:第6位置零注释:帧xx加3个字节注释:判断第六通状态注释:第六道是真注释:第5位置零注释:帧xx加3个字节注释:判断第五通状态注释:12 / 17第五道是真注释:第4位置零帧xx加3个字节End If If ab(0) >= 8 Then注释:判断第四通状态TD(4) = True注释:ab (0) = ab (0) - 8注释:第3位置零End If If ab (0) >= 4 Then TD (3) = True ab13 / 17(0) = ab (0) - 4 End If If ab (0) >= 2 Then TD (2) = True ab (0) = ab (0) - 2 End If If ab (0) >= 1 Then TD (1) = True End IfFor i = 1 To 8注释:注释:帧xx加3个字节注释:判断第三通状态14 / 17注释:第三道是真注释:第2位置零注释:帧xx加3个字节注释:判断第二通状态注释:注释:第0位置零注释:帧xx加3个字节注释:判断第一通状态注释:第一道是真注释:帧xx加3个字节If TD(i) = True Then15 / 17av = .Input注释:读取第一个数据字节(BCD码高位字节)ab (2) = av (0)注释:转换保存到字节数据类型数组av = .Input注释:读取第二个数据字节(BCD码低位字节)ab (3) = av (0)注释:转换保存到字节数据类型数组av = .Input注释:读取第三个接收字节(符号位字节)ab (4) = av (0)注释:转换保存到字节数据类型数组b1 = ab (2) - 6 * (ab (2) \ 16)注释:16 / 17高位字节压缩BCD码转换为实数b2 = ab (3) - 6 * (ab (3) \ 16)注释:低位字节压缩BCD码转换为实数注释:数值组合,标定小数点If ab(4) > 127 Then WW = -WW注释:判断数据符号位Label1(i-1) = Format(WW, 0.00)注释:显示毫米单位数值,2位小数If WW>Wmax(i) And WW<51 Then 注释:判断最大值,仪表在刚开始工作时有干扰,会传导一些乱码,位移传感器有参数偏差,最大值一般都略大于50毫米,所以取51为极限最大值,取-51为极限最小值。