本帖最后由 kindao2 于 2009-09-19 11:02:14 编辑

解决方案 »

  1.   

    建议你抛弃你的代码,写的不咋样。
    给你一个:http://download.csdn.net/source/1262066
      

  2.   

    Private Function FutComm(Cmd As String, OutputD As String, GDLen As Long, DelayS As Single) As String 
    On Error GoTo Out 
    Dim Dou1 As Double 
    Comm1.InBufferCount = 0: Comm1.OutBufferCount = 0 '初始化缓冲区
    If Comm1.PortOpen = False Then Comm1.PortOpen = True '打开串口
    Dou1 = Timer '初始化定时,计秒
    Comm1.Output = Cmd & "00" & OutputD & vbCr '发送GMAX+00+回车指令'等候,直到"接收缓冲区接收字节数不小于GDLEN"或者"时间超多DelayS秒"
    Do While Comm1.InBufferCount < GDLen And Timer - Dou1 < DelayS 
        DoEvents '执行过程外其它事件
        If Proj.End Then End 'Proj的END成员为真时,退出工程
        'If Process.StopBL Then GoTo Out 
    Loop 
    FutComm = Comm1.Input '返回接受缓冲区中所有字节
    Exit Function Out: '如果发生错误返回空字符串
        FutComm = "" 
    End Function 
    说明:Comm1是一个COMM控件 
    GMAX命令: GMAX <address> <CR>   Get Maximum V & C | 'GMAX指令格式:CMAX+地址+回车
    |    Voltage [???] Current [???] [CR]     | 
    |    [OK] [CR] 
    返回数值格式:XXXYYY+回车+OK+回车 共10个字节.前三个组成电压值,后三个组成电流值,之后是回车,OK,再接回车
    ------------------------------------------------------------------
    此函数确实不够可靠.通讯异常\其它错误\下位机没工作\等等异常都要导致返回空字符串,串口通讯应该明确超时错误,这是基本规矩.而且延迟等待不是COMM控件最佳应用方案.支持2楼主张,从新构架程序.但碍于楼主要求,还是加了足够的注解,供参考.
      

  3.   

    Private Function FutComm(Cmd As String, OutputD As String, GDLen As Long, DelayS As Single) As String 
    On Error GoTo Out 
    Dim Dou1 As Double 
    Comm1.InBufferCount = 0: Comm1.OutBufferCount = 0 '初始化缓冲区
    If Comm1.PortOpen = False Then Comm1.PortOpen = True '打开串口
    Dou1 = Timer '初始化定时,计秒
    Comm1.Output = Cmd & "00" & OutputD & vbCr '发送GMAX+00+回车指令'等候,直到"接收缓冲区接收字节数不小于GDLEN"或者"时间超多DelayS秒"
    Do While Comm1.InBufferCount < GDLen And Timer - Dou1 < DelayS 
        DoEvents '执行过程外其它事件
        If Proj.End Then End 'Proj的END成员为真时,退出工程
        'If Process.StopBL Then GoTo Out 
    Loop 
    FutComm = Comm1.Input '返回接受缓冲区中所有字节
    Exit Function Out: '如果发生错误返回空字符串
        FutComm = "" 
    End Function 
    说明:Comm1是一个COMM控件 
    GMAX命令: GMAX <address> <CR>   Get Maximum V & C | 'GMAX指令格式:CMAX+地址+回车
    |    Voltage [???] Current [???] [CR]     | 
    |    [OK] [CR] 
    返回数值格式:XXXYYY+回车+OK+回车 共10个字节.前三个组成电压值,后三个组成电流值,之后是回车,OK,再接回车
    ------------------------------------------------------------------
    此函数确实不够可靠.通讯异常\其它错误\下位机没工作\等等异常都要导致返回空字符串,串口通讯应该明确超时错误,这是基本规矩.而且延迟等待不是COMM控件最佳应用方案.支持2楼主张,从新构架程序.但碍于楼主要求,还是加了足够的注解,供参考.