用VB进行串口实时数据采集Word文件下载.docx
《用VB进行串口实时数据采集Word文件下载.docx》由会员分享,可在线阅读,更多相关《用VB进行串口实时数据采集Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
----在通用声明中定义程序所用变量:
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
i
LBound(Inbyte)
To
UBound(Inbyte)
+
Hex(Inbyte(i))
Chr(32)
for语句也没看懂,尤其是buffer这赋的是什么值?
Next
i
comEvSend
End
Select
获取十进制测量数据
’这下面的又是没看懂,应该是将十六进制转换为十进制,怎么转换的呢?
Len(Trim(Mid(buffer,
1,
2)))
1
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
x
y
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