用VB进行串口实时数据采集Word文件下载.docx

上传人:b****6 文档编号:18869963 上传时间:2023-01-01 格式:DOCX 页数:28 大小:74.90KB
下载 相关 举报
用VB进行串口实时数据采集Word文件下载.docx_第1页
第1页 / 共28页
用VB进行串口实时数据采集Word文件下载.docx_第2页
第2页 / 共28页
用VB进行串口实时数据采集Word文件下载.docx_第3页
第3页 / 共28页
用VB进行串口实时数据采集Word文件下载.docx_第4页
第4页 / 共28页
用VB进行串口实时数据采集Word文件下载.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

用VB进行串口实时数据采集Word文件下载.docx

《用VB进行串口实时数据采集Word文件下载.docx》由会员分享,可在线阅读,更多相关《用VB进行串口实时数据采集Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。

用VB进行串口实时数据采集Word文件下载.docx

----在通用声明中定义程序所用变量:

Dimab(4)AsByte 

‘字节数据类型数组,用来存储接收到的一组字节数据

DimavAsVariant‘用来从接收缓冲区读取数据

DimiAsInteger

DimjAsInteger

DimwAsInteger 

‘接收数据个数计数器

Dimb1AsSingle

Dimb2AsSingle

DimWWAsSingle 

‘十进制检测值

DimMaxWAsSingle 

‘最大值

DimMinWAsSingle 

‘最小值

----在窗体中添加名为Command1的[开始]按钮和名为MSComm1的MSComm控件。

----[开始]按钮的Click事件处理程序主要是对MSComm1控制的参数初始化设置,程序中大部分参数在设计时可在MSComm1控制的属性窗口中设置:

PrivateSubCommand1_Click()

‘开始按钮

WithMSComm1

.CommPort=2 

‘使用COM2

.Setting=“9600,N,8,1"

‘设置通信口参数

.InBufferSize=40 

‘设置MSComm1接收缓冲区为40字节

.OutBufferSize=2 

‘设置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=FalseThen 

‘判断通信口是否打开

.PortOpen=True 

‘打开通信口

IfErrThen 

‘错误处理

MsgBox“串口通信无效"

ExitSub

EndIf

EndWith

EndSub

----为了达到实时数据采集目的,实时数据采集处理程序采用MSComm事件驱动方式。

----MSComm1_OnComm的事件处理程序只处理comEvReceive事件,首先判断帧数据的开始字节,关闭OnComm接收事件,然后接收数据字节,将压缩BCD进行还原转换,再接收符号字节,判断数据符号,判断数据最大最小值,最后打开OnComm接收事件,等待下一次OnComm事件产生:

PrivateSubMSComm1_OnComm()

SelectCase.CommEvent

‘判断MSComm1通信事件

CasecomEvReceive 

‘收到Rthreshold个字节产生的接收事件

av=.Input 

‘读取一个接收字节

ab

(1)=av(0) 

‘转换保存到字节数据类型数组

Ifab

(1)=&HF0Then 

‘判断是否为数据开始标志

RThreshold=0 

‘关闭OnComm事件接收

Do

DoEvents

LoopUntil.InBufferCount>

=3 

‘循环等待MSComm1接收缓冲区>

=3个字节

w=w+1 

‘计数器累加计数

‘读取第二个数据字节(BCD码高位字节)

ab

(2)=av(0) 

‘读取第三个数据字节(BCD码低位字节)

ab(3)=av(0) 

‘读取第四个数据字节(符号位字节)

ab(4)=av(0) 

‘转换保存到字节数据类型数组 

b1=ab

(2)-6*(ab

(2)\16) 

‘高位字节压缩BCD码转换为实数

b2=ab(3)-6*(ab(3)\16) 

‘低位字节压缩BCD码转换为实数

WW=b1+b2/100 

‘数值组合,标定小数点

Ifab(4)>

127ThenWW=WW

‘判断数据符号位

Label1(0)=Format(WW,“0.00"

‘显示毫米单位数值,2位小数

Label1

(1)=Format(WW/25.4,“0.000"

‘显示英寸单位数值,3位小数

IfWW>

MaxWAndWW<

51Then

----‘判断最大值,仪表在刚开始工作时有干扰,会传导一些乱码,位移传感器有参数偏差,最大值一般都略大于50毫米,所以取51为极限最大值,取-51为极限最小值。

MaxW=WW

Label1

(2)=Format(MaxW,“0.00"

) 

‘显示毫米单位最大值,2位小数

Label1(3)=Format(MaxW/25.4,“0.000"

‘显示英寸单位最大值,3位小数

IfWW<

MinWAndWW>

-51Then

‘判断最小值

MinW=WW

Label1(4)=Format(MinW,“0.00"

‘显示毫米单位最小值,2位小数

Label1(5)=Format(MinW/25.4,“0.000"

   

‘显示英寸单位最小值,3位小数

‘打开MSComm1事件接收

CaseElse

EndSelect

EndSub

基于VB的串口数据采集

[来源:

机电论文|类别:

技术|时间:

2008-6-2114:

44:

00]

[字体:

大中小]

要求:

用VB编写一个小软件,采集电子数显千分表的数据

数显表接口参数:

数显表的专用接口可与PC机的RS232(9针)相接,其波特率4800,无奇偶校检,8位数据位,1位停止位,以AcsII码发送数据

窗体设计:

1个listbox,1个textbox,1个MSComm控件,2个CommandButton

程序设计:

DimindataAsVariant

Dimdata(100)AsSingle

Statici

i=i+1

data(i)=Text1.Text

List1.AddItemdata(i)

EndSub 

‘...按键一次,采集一个数据,并存入List1中

PrivateSubCommand2_Click()

MSComm1.PortOpen=False 

'

….关端口

UnloadMe

EndSub 

'

...退出

PrivateSubForm_Load()

MSComm1.CommPort=1'

...使用Com1口

MSComm1.Settings="

4800,n,8,1"

...设置通讯参数

MSComm1.RThreshold=10

MSComm1.streshold=10

MSComm1.PortOpen=True'

...打开串口

Text1.Text="

"

SelectCaseMSComm1.CommEvent

CasecomEvReceive'

...有接收事件发生

indata=MSComm1.Input

Text2.Text=(indata/10)‘…text1实时显示数显表的数据

MSComm1.InBufferCount=0'

...清空输入寄存器

EndSelect

我这有一段VB程序是为了画实时采集曲线的。

软件编程我不行,如果大家有看得懂得,请帮我看看。

程序不多

Private 

Sub 

MSComm1_OnComm()

 

Dim 

Inbyte() 

As 

Byte

buffer 

String

datatemp(1000) 

Single 

If 

num 

>

199 

Then 

Call 

renew 

刷新绘图区

读取仪表返回数据串

Select 

Case 

MSComm1.CommEvent

comEvReceive

Inbyte 

MSComm1.Input'

这地方看不懂,数组可以这样赋值吗?

For 

LBound(Inbyte) 

To 

UBound(Inbyte)

Hex(Inbyte(i)) 

Chr(32) 

for语句也没看懂,尤其是buffer这赋的是什么值?

Next 

i

comEvSend

End 

Select

获取十进制测量数据

’这下面的又是没看懂,应该是将十六进制转换为十进制,怎么转换的呢?

Len(Trim(Mid(buffer, 

1, 

2))) 

Then

datatemp(num) 

Val("

&

H"

&

Mid(buffer, 

3, 

2) 

Str("

0"

) 

2)) 

0.01

Else

If

‘绘制曲线

draw()

Picture1.Cls

Picture1.DrawWidth 

2

Picture1.BackColor 

QBColor(7)

’下面的程序我看不懂,用的是什么原理画的曲线呢?

Picture1.Scale 

(0, 

50)-(200, 

0)

1

X1 

(i 

1):

Y1 

datatemp(i 

1)

X2 

i:

Y2 

datatemp(i)

Picture1.Line 

(X1, 

Y1)-(X2, 

Y2), 

QBColor

(1)

End 

Sub

问题点数:

100 

回复次数:

10

修改删除举报引用回复

加为好友

发送私信

在线聊天

CathySun118

∙等级:

∙可用分等级:

富农

∙总技术分:

88266

∙总技术分排名:

66

∙2

发表于:

2007-06-2514:

411楼 

得分:

连点法阿

Winters_lee

中农

1658

12870

2007-06-2609:

41:

372楼 

画曲线啊,用这个吧:

实时曲线左移函数,定义在模块中

Public 

Declare 

Function 

BitBlt 

Lib 

"

gdi32"

(ByVal 

hDestDC 

Long, 

ByVal 

nWidth 

nHeight 

hSrcDC 

xSrc 

ySrc 

dwRop 

Long) 

Long

建立一个类,作为画实时曲线

Option 

Explicit

pCurveNUM 

Integer

pCurveName 

pCurveMax 

Double

pCurvemin 

pricCurve 

PictureBox

priCurvePoint(6) 

priCurveData(6) 

priDrawY0(6) 

priDrawY1(6) 

priDrawNMinute 

priDrawTMinute 

WithEvents 

priTimerDraw 

Timer

Property 

Let 

ltDrawTimer(ByRef 

lTimer 

Timer)

Set 

lTimer

Property

ltGiveCurveData(ByVal 

lDataPoint 

Variant)

i%

pCurveNUM

priCurvePoint(i) 

CInt(lDataPoint(i))

Ne

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

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1