急!急!急!在线等待!

csh79 2003-02-25 03:46:36
小弟要做一个关于数字滤波的东东,不停采集数据,要求总是取50个数进行求平均值的计算,进来一个数据,就将第一个数据去掉,然后对50个数据进行平均,如此的循环。

请教各位,像这样的运算,在vb下应该使用什么事件触发?
是否有人做过这方面的东东,请大家明示!
...全文
74 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kitty2001 2003-02-25
  • 打赏
  • 举报
回复
采用中断(事件)来处理,50个数据不多,直接用数组存储,计算平均值。
不知道你说的a/d是通过插卡的还是com的,我知道com的有现成的控件(mscommcontrol)可以使用;如果是通过插卡的,第三方有api函数的。
用户 昵称 2003-02-25
  • 打赏
  • 举报
回复
您可以用API函数SetWindowLong指定处理消息的窗口过程(window procedure)为自定义的函数WindowProc,捕获消息ID为WM_USER+1的自定义消息或系统消息。并且,为了保证窗口能正确的响应消息,需要保存原来默认的窗口过程并在自定义函数WindowProc中调用。如下例,在按钮事件中发送自定义消息,WindowProc捕获了窗口大小变化的系统定义消息和用户自定义的消息并显示用户自定义的消息参数wParam:
在Moduel中加入以下代码,

Option Explicit
Private Const GWL_WNDPROC = -4
Public Const GWL_USERDATA = (-21)
Public Const WM_SIZE = &H5
Public Const WM_USER = &H400
Private Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Function Hook(ByVal hwnd As Long) As Long
Dim pOld As Long
‘指定自定义的窗口过程
pOld = SetWindowLong(hwnd, GWL_WNDPROC, _
AddressOf WindowProc)
‘保存原来默认的窗口过程指针
SetWindowLong hwnd, GWL_USERDATA, pOld
Hook = pOld
End Function

Public Sub Unhook(ByVal hwnd As Long, ByVal lpWndProc As Long)
Dim temp As Long
'Cease subclassing.
temp = SetWindowLong(hwnd, GWL_WNDPROC, lpWndProc)
End Sub

Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_SIZE Then
‘处理WM_SIZE消息
MsgBox "SIZE"
End If
If uMsg = WM_USER + 1 Then
MsgBox wParam
End If
Dim lpPrevWndProc As Long
‘查询原来默认的窗口过程指针
lpPrevWndProc = GetWindowLong(hw, GWL_USERDATA)
‘调用原来的窗口过程
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg,wParam, lParam)
End Function

在Form中加入以下代码:

Dim wParam As Long
Dim lParam As Long
Dim lResult As Long
Private Sub Command1_Click()
wParam = 12345
lResult = SendMessage(Me.hwnd, WM_USER + 1, wParam, lParam)
End Sub

Private Sub Form_Load()
Me.Tag = Hook(Me.hwnd)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Unhook Me.hwnd, Me.Tag
End Sub
佛的光辉 2003-02-25
  • 打赏
  • 举报
回复
在采集到数据时处理
northwolves 2003-02-25
  • 打赏
  • 举报
回复
use collection:Dim x As New Collection


Private Sub Timer1_Timer()
x.Remove 0
x.Add data50
End Sub

AechoJohn 2003-02-25
  • 打赏
  • 举报
回复
在采集到数据的时候马上进行处理。
qixg 2003-02-25
  • 打赏
  • 举报
回复
msdn上说系统最细的分时好像是1/18秒。
csh79 2003-02-25
  • 打赏
  • 举报
回复
数据是通过a/d转换进来的。原来我是通过定时器触发的,
但是其实时性太差。
Cooly 2003-02-25
  • 打赏
  • 举报
回复
数据如何"进来"?在"进来"的时候触发就可以了
minajo21 2003-02-25
  • 打赏
  • 举报
回复
用个timer控件触发,Interval根据需要自己定

在timer事件里判断是否有值进来,如果有,则:
dim temp (1 to 50 )

for i = 1 to 49
temp(i) = temp(i+1)
next i

temp(50)='新进来的

然后求平均值

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧