用VB进行串口实时数据采集.doc

上传人:小飞机 文档编号:2762564 上传时间:2023-02-24 格式:DOC 页数:22 大小:229.50KB
返回 下载 相关 举报
用VB进行串口实时数据采集.doc_第1页
第1页 / 共22页
用VB进行串口实时数据采集.doc_第2页
第2页 / 共22页
用VB进行串口实时数据采集.doc_第3页
第3页 / 共22页
用VB进行串口实时数据采集.doc_第4页
第4页 / 共22页
用VB进行串口实时数据采集.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《用VB进行串口实时数据采集.doc》由会员分享,可在线阅读,更多相关《用VB进行串口实时数据采集.doc(22页珍藏版)》请在三一办公上搜索。

1、精选优质文档-倾情为你奉上用VB进行串口实时数据采集 /ChenLL发表于2007-08-10, 20:28 用VB进行串口实时数据采集 本文介绍VB6.0利用MSComm通信控件,开发微机通过串口对工业仪表进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动后用于其他数据采集或实时控制程序中。 -一台工业专用实时检测仪表,接高精度位移传感器,用于测量微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。该仪表带有一个9针的RS-232C 串口,能与微机进行串口数据通信,实时传送检测数据,通过微机软件处理可实现工业实时监控。 -该仪表的串

2、口数据通信协议是:数据传输速率为 9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。仪表每秒发送50帧检测数据,每帧数据由4个字节组成。第一个字节定义为二进制常数0F0H,是每帧数据开始的标志字节;后面连续2个字节为数据字节,采用压缩的BCD码编码方式,高位在前,低位在后,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第四个字节为符号字节,该字节第八位为1,即: 1 x x x x x x x 则为负数;第八位为0,即: 0 x x x x x x x 则为正数。 -例如:0F0H 26H 87H 80H 0F0H 34H 62H

3、 00H 表示 26.87 34.62。 -通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序。 -为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下: RThreshold = 1 接收缓冲区收到一个字节产生OnComm事件 InputLen = 1 每次读取一个字节-仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms时间,然后再进行数据处理。如果微机在下一帧数据接收前即20ms内能将数据计算

4、处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区4字节),这时完全可以实现实时监测或实时控制;如果微机在20ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情况下接收缓冲区的大小就会影响实

5、时监测效果,所以接收缓冲区设置不能过大,以保证数据处理的实时性。 -设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但用Input属性读取数据时,不能直接赋值给 Byte 类型变量,只能通过先赋值给一个 Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型数变量中。 -VB中有Byte类型变量,但没有字节的位处理语句,符号字节的位处理要判断符号字节的值是否大于 127,大于127则为负数;压缩的BCD码存入 Byte类型变量,VB系统只按十进制数处理,这要通过一个简单算法换算,解压BCD码才能还原成十进制表示数值。假如a是B

6、yte类型变量,D是Single类型变量,将一个压缩的BCD 码存入a中,则算法是: D=(a16)10 a(a16)16 则D=a(a16)6-程序清单: -在通用声明中定义程序所用变量: Dim ab(4) As Byte 字节数据类型数组,用来存储接收到的一组字节数据 Dim av As Variant 用来从接收缓冲区读取数据 Dim i As Integer Dim j As Integer Dim w As Integer 接收数据个数计数器 Dim b1 As Single Dim b2 As Single Dim WW As Single 十进制检测值 Dim MaxW As

7、Single 最大值 Dim MinW As Single 最小值-在窗体中添加名为Command1的开始按钮和名为 MSComm1的MSComm控件。 - 开始按钮的Click事件处理程序主要是对MSComm1控制的参数初始化设置,程序中大部分参数在设计时可在MSComm1控制的属性窗口中设置: Private Sub Command1_Click() 开始按钮 With MSComm1 .CommPort=2 使用COM2 .Setting=“9600,N,8,1 设置通信口参数 .InBufferSize=40 设置MSComm1接收缓冲区为40字节 .OutBufferSize=2 设

8、置MSComm1发送缓冲区为2字节 .InputMode = comInputModeBinary 设置接收数据模式为二进制形式 .InputLen = 1 设置Input 一次从接收缓冲读取字节数为1 .SThreshold = 1 设置Output 一次从发送缓冲读取字节数为1 .InBufferCount = 0 清除接收缓冲区 .OutBufferCount = 0 清除发送缓冲区 MaxW = 99 最大值赋初值 MinW = 99 最小值赋初值 w = 0 数据个数计数器清零 .RThreshold = 1 设置接收一个字节产生OnComm事件 If .PortOpen = Fal

9、se Then 判断通信口是否打开 .PortOpen = True 打开通信口 If Err Then 错误处理 MsgBox “串口通信无效 Exit Sub End If End If End WithEnd Sub-为了达到实时数据采集目的,实时数据采集处理程序采用MSComm事件驱动方式。 -MSComm1_OnComm的事件处理程序只处理 comEvReceive事件,首先判断帧数据的开始字节,关闭OnComm接收事件,然后接收数据字节,将压缩BCD进行还原转换,再接收符号字节,判断数据符号,判断数据最大最小值,最后打开OnComm接收事件,等待下一次OnComm事件产生: Pri

10、vate Sub MSComm1_OnComm() With MSComm1Select Case .CommEvent 判断MSComm1通信事件 Case comEvReceive 收到Rthreshold个字节产生的接收事件 av = .Input 读取一个接收字节 ab(1) = av(0) 转换保存到字节数据类型数组 If ab(1) = HF0 Then 判断是否为数据开始标志 RThreshold = 0 关闭OnComm事件接收 Do DoEvents Loop Until .InBufferCount = 3 循环等待MSComm1接收缓冲区=3个字节 w = w 1 计数器

11、累加计数 av = .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) 高位字节压缩BCD码转换为实数 b2 = ab(3) 6 (ab(3)16) 低位字节压缩BCD码转换为实数 WW = b1 b2 / 100 数值组合,标定小数点 If ab(4) 127

12、 Then WW=WW 判断数据符号位 Label1(0) = Format(WW, “0.00) 显示毫米单位数值,2位小数 Label1(1) =Format(WW /25.4, “0.000) 显示英寸单位数值,3位小数 If WW MaxW And WW 51 Then-判断最大值,仪表在刚开始工作时有干扰,会传导一些乱码,位移传感器有参数偏差,最大值一般都略大于50毫米,所以取51为极限最大值,取51为极限最小值。 MaxW = WW Label1(2) = Format(MaxW, “0.00) 显示毫米单位最大值,2位小数 Label1(3) = Format(MaxW/25.4

13、,“0.000) 显示英寸单位最大值,3位小数 End If If WW 51 Then 判断最小值 MinW = WW Label1(4) = Format(MinW, “0.00) 显示毫米单位最小值,2位小数 Label1(5) = Format(MinW/25.4,“0.000) 显示英寸单位最小值,3位小数 End If .RThreshold = 1 打开MSComm1事件接收 End If Case Else End Select End WithEnd Sub 基于VB的串口数据采集 来源:机电论文 | 类别:技术 | 时间:2008-6-21 14:44:00 字体: 要求:

14、用VB编写一个小软件,采集电子数显千分表的数据数显表接口参数:数显表的专用接口可与PC机的RS232(9针)相接,其波特率4800,无奇偶校检,8位数据位,1位停止位,以AcsII码发送数据窗体设计:1个listbox,1个textbox,1个MSComm控件,2个CommandButton程序设计:Dim indata As VariantDim data(100) As SinglePrivate Sub Command1_Click()Static ii = i + 1data(i) = Text1.TextList1.AddItem data(i)End Sub .按键一次,采集一个数

15、据,并存入List1中Private Sub Command2_Click()MSComm1.PortOpen = False.关端口Unload MeEnd Sub .退出Private Sub Form_Load()MSComm1.CommPort = 1 .使用Com1口MSComm1.Settings = 4800,n,8,1.设置通讯参数MSComm1.RThreshold = 10MSComm1.streshold = 10MSComm1.PortOpen = True .打开串口Text1.Text = End SubPrivate Sub MSComm1_OnComm()Sel

16、ect Case MSComm1.CommEventCase comEvReceive .有接收事件发生indata = MSComm1.InputText2.Text = (indata / 10) text1实时显示数显表的数据MSComm1.InBufferCount = 0 .清空输入寄存器End SelectEnd Sub我这有一段VB程序是为了画实时采集曲线的。 软件编程我不行,如果大家有看得懂得,请帮我看看。 程序不多 Private Sub MSComm1_OnComm() Dim Inbyte() As Byte Dim buffer As String Dim datate

17、mp(1000) As Single If num 199 Then Call renew 刷新绘图区 读取仪表返回数据串 Select Case MSComm1.CommEvent Case comEvReceive Inbyte = MSComm1.Input 这地方看不懂,数组可以这样赋值吗? For i = LBound(Inbyte) To UBound(Inbyte) buffer = buffer + Hex(Inbyte(i) + Chr(32) for语句也没看懂,尤其是buffer这赋的是什么值? Next i Case comEvSend End Select 获取十进制

18、测量数据 这下面的又是没看懂,应该是将十六进制转换为十进制,怎么转换的呢? If Len(Trim(Mid(buffer, 1, 2) = 1 Then datatemp(num) = Val( &H & Mid(buffer, 3, 2) & Str( 0 ) & Mid(buffer, 1, 2) * 0.01 Else datatemp(num) = Val( &H & Mid(buffer, 3, 2) & Mid(buffer, 1, 2) * 0.01 End If 绘制曲线 Private Sub draw() Picture1.Cls Picture1.DrawWidth =

19、2 Picture1.BackColor = QBColor(7) 下面的程序我看不懂,用的是什么原理画的曲线呢? Picture1.Scale (0, 50)-(200, 0) For i = 1 To num - 1 X1 = (i - 1): Y1 = datatemp(i - 1) X2 = i: Y2 = datatemp(i) Picture1.Line (X1, Y1)-(X2, Y2), QBColor(1) Next i End Sub 问题点数:100回复次数:10 等级: 可用分等级:富农 总技术分:88266 总技术分排名:66 2发表于:2007-06-25 14:4

20、4:411楼得分:0连点法阿 等级: 可用分等级:中农 总技术分:1658 总技术分排名:12870 发表于:2007-06-26 09:41:372楼得分:0画曲线啊,用这个吧: 实时曲线左移函数,定义在模块中 Public Declare Function BitBlt Lib gdi32 (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal y

21、Src As Long, ByVal dwRop As Long) As Long 建立一个类,作为画实时曲线 Option Explicit Public pCurveNUM As Integer Public pCurveName As String Public pCurveMax As Double Public pCurvemin As Double Private pricCurve As PictureBox Private priCurvePoint(6) As Integer Private priCurveData(6) As Double Private priDrawY

22、0(6) As Double Private priDrawY1(6) As Double Private priDrawNMinute As Integer Private priDrawTMinute As Integer Private WithEvents priTimerDraw As Timer Public Property Let ltDrawTimer(ByRef lTimer As Timer) Set priTimerDraw = lTimer End Property Public Property Let ltGiveCurveData(ByVal lDataPoin

23、t As Variant) Dim i% For i = 1 To pCurveNUM priCurvePoint(i) = CInt(lDataPoint(i) Next End Property Public Property Let ltGetPicture(ByRef lDrawPicBox As PictureBox) Set pricCurve = lDrawPicBox End Property Private Sub sDrawTheRealTimeCurve() Dim ypixels, xpixels, i% Dim ShowMode As Long, ii As Long

24、, tm As String, hBmp As Long pricCurve.DrawWidth = 1 hBmp = pricCurve.hDC ShowMode = &HCC0020 ii = BitBlt(hBmp, 0, 0, pricCurve.ScaleWidth - 1, pricCurve.ScaleHeight - 1, hBmp, 1, 0, ShowMode) Dim T As Integer T = Minute(Now() priDrawNMinute = T If priDrawNMinute priDrawTMinute Then pricCurve.Curren

25、tX = pricCurve.ScaleWidth - 19 pricCurve.CurrentY = pricCurve.ScaleHeight - 11 pricCurve.Print priDrawNMinute End If priDrawTMinute = priDrawNMinute pricCurve.ScaleMode = vbPixels ypixels = pricCurve.ScaleHeight - 1 xpixels = pricCurve.ScaleWidth - 1 For 1 to 6 curves If pCurveNUM 6 Or pCurveNUM 1 T

26、hen pricCurve.Line (xpixels - 1, priDrawY0(2)-(xpixels - 1, priDrawY1(2), vbWhite If pCurveNUM 2 Then pricCurve.Line (xpixels - 1, priDrawY0(3)-(xpixels - 1, priDrawY1(3), vbGreen If pCurveNUM 3 Then pricCurve.Line (xpixels - 1, priDrawY0(4)-(xpixels - 1, priDrawY1(4), spColor(3).FillColor If pCurve

27、NUM 4 Then pricCurve.Line (xpixels - 1, priDrawY0(5)-(xpixels - 1, priDrawY1(5), spColor(4).FillColor If pCurveNUM 5 Then pricCurve.Line (xpixels - 1, priDrawY0(6)-(xpixels - 1, priDrawY1(6), spColor(5).FillColor For i = 1 To 6 priDrawY0(i) = priDrawY1(i) Next End Sub Public Sub clsInit() Dim i% For

28、 i = 1 To 6 priDrawY0(i) = pricCurve.Height priDrawY1(i) = pricCurve.Height Next priTimerDraw.Interval = 1000 priTimerDraw.Enabled = True End Sub Private Sub priTimerDraw_Timer() Dim i% For i = 1 To pCurveNUM priCurveData(i) = gRealTimeData(priCurvePoint(i) Next Call sDrawTheRealTimeCurve End Sub 刷新

29、速度可以调整定时器的时间间隔得到,画出来的效果和Windows任务管理器中的那个CPU工作曲线一样。 等级: 可用分等级:中农 总技术分:1658 总技术分排名:12870 发表于:2007-06-26 09:45:303楼得分:0方法就是,先初始化PictureBox控件,然后记住本次的坐标点,下次的坐标点和前一次的连线,然后曲线左移,在曲线最下面写上时间,就OK了。实时曲线诞生! 等级: 可用分等级:中农 总技术分:1658 总技术分排名:12870 发表于:2007-06-26 10:14:164楼得分:0Inbyte = MSComm1.Input 这地方看不懂,数组可以这样赋值吗?

30、/可以,因为MScomm的属性之前应该是设置成数组形式接收的,如果设置为字符串接收的话就得用String变量接收了。 buffer = buffer + Hex(Inbyte(i) + Chr(32) for语句也没看懂,尤其是buffer这赋的是什么值? /接收完整的信息,一直接收,然后每次用Chr$(32)这个换行符格开。 这下面的又是没看懂,应该是将十六进制转换为十进制,怎么转换的呢? /16进制的表示就是行如: &HXXXX ,其中&H是必须的,表示16进制,后面的XXXX为16进制值,所以使用Val,Clng,Cint等强制转换都可以直接将其转换。 等级: 可用分等级:长工 总技术分

31、:472 总技术分排名:34749 发表于:2007-06-26 13:23:505楼得分:0Visual Graph是一套强大的交互图形开发平台,她能非常方便地建造基于图形的界面、制作各种图形元件、实现图形管理、图形建模、制作监控系统、表单系统、绘图系统、流程设计、CAD软件等。她提供功能非常强大的ActiveX控件,和其他流行的编程语言共同工作,极大地弥补了这些语言在图形处理方面的不足。也可以嵌入IE浏览器中,实现网上图形编辑和控制等。http:/www.visual-基于串口通信的远程自动抄表系统实现 作 者:王 鹏摘 要:对远程抄表系统的方案、系统的组成、硬件的配置、软件设计、工作原理

32、、功能以及技术性能进行了论述。该系统通过下位机(MCU)和无线收发模块(PTR2000)采集、整理数据,通过串口经MODEM模块与上位机通信,水、电、气公司通过上位机(PC机)收集数据,实现远程无线自动抄表的功能。 引言在人们的日常生活中,水、电、气是不可缺少的必备生活保障,然而对于水、电、气供应公司来说,每个月上门抄取各个用户的三表读数却是非常繁重的工作,需要投入大量的人力和物力。现在许多公司在研究自动抄表系统,但是他们通常采用电话线或者是专线完成与上位机的通讯,成本比较高。详见参考资料367。针对这种情况,作者设计了一种远程无线自动抄表系统。自动抄表系统,简称ARMS(Automatic

33、Reading Meter System),是供应水、电、气的部门将安装在用户处的水、电、气表所记录的用量等数据通过遥测、传输和计算机系统汇总到营业部门,代替人工抄表及一连串后续工作的系统。该系统的无线通信是采用GSM短消息业务,它的实现是迈向家庭自动化的第一步,并有助于提高水电系统管理的现代化水平。该系统具有两个主要特点:其一系统数据采集点多,成千上万,数据量大;其二系统是一个覆盖面很广的通信网络,采集点具有分散性。对系统的要求,一方面应造价低、经济实惠,另一方面数据的采集要准确及时,又要有一定的环境适应能力和抗干扰能力。随着现代化电子技术的发展,通信技术和计算机技术都有了飞速发展,而两者的

34、结合又进一步演化出许多新的通信方式和通信系统,为ARMS的实现提供了可能。这样可避免抄表员上门抄表带来的弊端,省却了上门抄表打扰用户的尴尬问题,对公司、用户都有很大的便利,具有良好的市场前景。特别是在大中城市里,该系统具有很广的推广价值。1系统的组成及工作原理系统组成:数据采集部分;数据发送、无线通信部分;数据接收、处理部分。工作原理:数据采集装置首先通过传感器采集三表的读数,将采集的数据存入单片机(AT89C2051)内;单片机再通过无线通讯模块PTR2000(发端)将数据发送,用户集中器的PTR2000(收端)将发送来的数据接收,下位机主要完成采集数据、分时存储和同上位机通信的功能,它通过串行接口与GSM/Modem联接,以公众网(GSM)为平台,通过电信公众网络传输数据。随着GSM移动通信网络的建设和发展,移动通信网日益庞大复杂,所覆盖地区也日益广泛。因而通过GSM移动通信网络进行数据的传输也成为了一种新式的数据传输手段

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号