我用winio函数采集AD板卡数据,用多媒体定时器定时中断采集,在集成环境下运行可以(偶尔出现VB崩溃),但编译成EXE文件后,一运行就出错!请高手指教!
Option Explicit
Public Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
Public Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
Public Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Public Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal _
uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, _
ByVal uFlags As Long) As Long
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public lmmCount As Long
Public actTime1 As Long
Public lTimeID As Long
Public cyz(0 To 7) As Long
Public saomiaoshu As Byte
'timeSetEvent的回调函数
Public Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _
ByVal dw1 As Long, ByVal dw2 As Long)
saomiaoshu = saomiaoshu + 1
If saomiaoshu = 5 Then
    saomiaoshu = 0
End If
Form1.Text2.Text = saomiaoshu
Module1.ZhongLiangCaiYang
'Module1.SuDuCaiYang
'PID
End Sub
Sub ZhongLiangCaiYang()
Dim i As Long
Dim j As Long
Dim k As Boolean
Dim temp As Long   'Temp:临时变量,cysj:采样数据,cymin:采样最小值,cymax:采样最大值,cylj:采样累计
Dim L As Long
Dim lh As Long
Dim lb As Long
Dim cymin(0 To 7) As Long
Dim cymax(0 To 7) As Long
Dim cylj(0 To 7) As Long
Dim cysj(0 To 7) As Long
Dim temp1(0 To 7) As Long
Dim temp2(0 To 7) As Long
For i = 0 To 7 '循环采样
    'temp = 0
    cymin(i) = 4095
    cymax(i) = 0
    cylj(i) = 0
   For j = 0 To 4 '5次平均滤波
       SetPortVal (&H220 + 10), i, 1 '设置多路扫描寄存器,设置通道
        SetPortVal (&H220 + 9), 1, 1 '设置增益控制寄存器,输入范围:0~5V
        SetPortVal (&H220 + 12), 0, 1 '触发AD转换
        GetPortVal (&H220 + 5), L, 1
        k = (L And &H10)
        If k = False Then '判断AD转换是否结束
            Module1.GetPortVal (&H220 + 5), lh, 1 '读AD数据寄存器高4位字节
            Module1.GetPortVal (&H220 + 4), lb, 1 '读AD数据寄存器低8位字节
        End If
        temp1(i) = lh
        temp2(i) = lb
        cysj(i) = (temp1(i) And &HF) * 256 + temp2(i) '12位AD转换结果
        cylj(i) = cylj(i) + cysj(i)
        If cysj(i) >= cymax(i) Then cymax(i) = cysj(i)
        If cysj(i) <= cymin(i) Then cymin(i) = cysj(i)
    Next j
    cyz(i) = (cylj(i) - cymax(i) - cymin(i)) / 3
    Form1.Text1(i).Text = cyz(i)
Next i
End SubOption ExplicitPrivate Sub Command1_Click()
Unload Me
End SubPrivate Sub Form_Load()
If Module1.InitializeWinIo = False Then
    MsgBox "致命错误!", vbOKOnly + vbCritical, "警告"
    Unload Me
Else
actTime1 = Module1.GetTickCount
lTimeID = Module1.timeSetEvent(200, 100, AddressOf Module1.TimeProc, 1, 1)
End If
End SubPrivate Sub Form_Unload(Cancel As Integer)
Module1.ShutdownWinIo
Module1.timeKillEvent lTimeID
End Sub

解决方案 »

  1.   

    我碰到这个问题,运算式太复杂,使用了很多VB函数,在集成环境下运行没有问题。但编译成EXE,一运行就崩溃!
    后来,在计算式上下功夫,尽量简化,解决了问题。
      

  2.   

    我就是把zhongliangcaiyang过程里的语句删除的只剩一条也不行
    ub ZhongLiangCaiYang()
    Dim i As Long
    Dim j As Long
    Dim k As Boolean
    Dim temp As Long   'Temp:临时变量,cysj:采样数据,cymin:采样最小值,cymax:采样最大值,cylj:采样累计
    Dim L As Long
    Dim lh As Long
    Dim lb As Long
    Dim cymin(0 To 7) As Long
    Dim cymax(0 To 7) As Long
    Dim cylj(0 To 7) As Long
    Dim cysj(0 To 7) As Long
    Dim temp1(0 To 7) As Long
    Dim temp2(0 To 7) As Long
    For i = 0 To 7 '循环采样
        'temp = 0
        cymin(i) = 4095
        cymax(i) = 0
        cylj(i) = 0
       For j = 0 To 4 '5次平均滤波
           SetPortVal (&H220 + 10), i, 1 '设置多路扫描寄存器,设置通道
    Next i
    End Sub 
      

  3.   

    setportval不复杂,就是一个往端口写的函数
      

  4.   

    谢谢!感谢supermanking!能告诉我两种编译的区别吗?请指教
      

  5.   

    好像是以Pentium CPU 指令集作为标准编译的。