我想的是:首先发Y,看是否读到P,若成功,则后面发P、U、F,分别将值读出。然后,再发Y,周而复始,
若中途或一开始发Y,读不到P,则连续发十次,再收不到则报警。
还请指点。
Dim binP As Boolean '电源通信是否握手成功,则接着发后面的..
Dim Varp2, Varp3 As String '判断串口能否收到S  电源是否在线
'我用了二个定时器,一个发“Y”,另一个,初始关闭,待确认电源在线后,再打开,发送后面的.
Private Sub Form_Load()
 MyCom1 MSComm2  ‘调用串口
 timer2.enabled=flase  '2号定时器不能用
 Varp2 = "S"
End Sub
'向电源发送握手信息
Private Sub Timer5_Timer()
     MSComm2.Output = "Y"
End Sub
'串口事件
Private Sub MSComm2_OnComm()
   Call Sleep(50)   '延时
  
  If MSComm2.CommEvent = 2 Then
     MSComm2.RThreshold = 20
     Dim i
     For i = 1 To MSComm2.InBufferCount
       SwichVar1 i   ’将不定长的数据一个个接起来
       buffer1 = buffer1 & Hex(InByte(i))
     Next i
        Varp3 = HexToStr(buffer1)'将收到的转成STR
        Text1.Text = Varp3   '此处是监测点
  End If
     If StrComp(Varp2, Varp3, vbBinaryCompare) = 0 Then  '若相同
           POWER1Alarm.FillColor = QBColor(10)        ‘灯变绿
            binP = True                                  '变量为真
            Timer1.Enabled = False                   '关闭1号定时器
            Timer6.Enabled = True                      '打开2号定时器
     Else
          UPS1Alarm.FillColor = QBColor(12)
            binADDRS = False
            Timer6.Enabled = False
     End If
    若不加这一段,则发送没有问题,若我后面发“P”,读出的值也就是“150”功率,此值也就不等于“S”。这时,程序就停了,好像这里有点乱。
    ( If temp = 1 Then
        Varp3 = HexToStr(buffer1)
        Text2.Text = Varp3      '监测点二
     End If  )
            buffer1 = ""
            MSComm2.RThreshold = 1     
End Sub
'向电源发送读命令
Private Sub Timer6_Timer()
    If binADDRS = True Then
          temp = temp + 1
      If temp = 1 Then
            MSComm2.Output = "P"  '读功率值
      ElseIf temp = 2 Then
            MSComm2.Output = "U"   '读电压值
      ElseIf temp = 3 Then
            MSComm2.Output = "f"   '读频率值
      End If
         If temp > 3 Then temp = 0
    End If
End Sub

解决方案 »

  1.   

    Public Status As Boolean
    Dim Smsg(2) As String
    Dim msgNext As BytePrivate Sub Form_Load()
    MSComm1.PortOpen = True
    Status = False
    Smsg(0) = "P"
    Smsg(1) = "U"
    Smsg(2) = "F"
    'msgNext = 0
    End Sub
    Private Sub MSComm1_OnComm()
        Dim tmp
        Dim curr As Byte
        tmp = MSComm1.Input
        If tmp = "S" Then
            Status = True
            msgNext = 0
            'Exit Sub
        Else 'If Status Then
        
            Select Case msgNext
                Case 0
                    Text1.Text = Text1.Text & Smsg(msgNext) & " = " & (tmp)
                Case 1
                    Text1.Text = Text1.Text & ", " & Smsg(msgNext) & " = " & (tmp)
                Case 2
                    Text1.Text = Text1.Text & ", " & Smsg(msgNext) & " = " & (tmp) & vbCrLf
            End Select
            msgNext = msgNext + 1
            If msgNext = 3 Then
                msgNext = 0
                Status = False
            End If
        End If
    End Sub
    Private Sub Timer1_Timer()
        If Not Status Then
            MSComm1.Output = "Y"
            msgNext = 0
        Else
            Select Case msgNext
                Case 0
                    MSComm1.Output = Smsg(msgNext)
                Case 1
                    MSComm1.Output = Smsg(msgNext)
                Case 2
                    MSComm1.Output = Smsg(msgNext)
                    'Status = False
            End Select
        End If
        'Timer1.Enabled = False
    End Sub