VB与单片机的串口通信
PC->MCU每次通信开始字节0XAA,然后MCU->PC 0X5A 0X79
单击联机命令按钮:首先上位机向单片机发送0XAA,上位机如果收到单片机返回的0X5A 0X79,则开始发送联机指令:串头(0XA5,0X67,0X35,0X31,0X31,0X30),0X02,0X20,0X10,0X30,串尾(0XA0),此时上位机如果收到0X35,0X82,0X20,0X10,则表示联机成功
我自己写的代码,通过串口调试助手调试总是收发都不对,现把部分代码贴出来,望高手指点一下Option Explicit
Dim strbuff As String
Dim inbte() As Byte
Dim outdata As Variant
Dim OUT() As Byte
Dim n As Integer
Dim aa(0) As Byte
Dim indata As String
Private Sub Form_Load() '程序初始化
With MSComm1
    .CommPort = 1
    .Settings = "38400,n,8,1"
    .OutBufferCount = 0
    .InBufferCount = 0
    .RThreshold = 2
    .SThreshold = 0
    .OutBufferSize = 512
    .InBufferSize = 1024
    .InputLen = 0
    If Not .PortOpen Then             '判断通信口是否打开
         On Error Resume Next
        .PortOpen = True                '打开通信口
          If Err Then                   '错误处理
             MsgBox "串口被占用或此串口不存在!通信无效!", 16, "错误提示"
             Exit Sub
          End If
      End If
End With
End Sub
Private Sub mnuexit_Click() '退出程序
Dim a
 a = MsgBox("您确定要退出系统吗?", vbOKCancel + vbQuestion, "提示")
If a = 1 Then
   Unload Me
Else
Exit Sub
End If
End SubPrivate Sub MSComm1_OnComm() '接收事件
Dim I As Integer
Select Case MSComm1.CommEvent
       Case 2
       strbuff = MSComm1.Input
       inbte() = strbuff
       For I = 0 To UBound(inbte)
           If Len(Hex(inbte(I))) = 1 Then '判断接收字节长度,不够两位补0
              indata = indata & "0" & Hex(inbte(I))
            Else
              indata = indata & Hex(inbte(I))
            End If
       Next I
       MSComm1.InBufferCount = 0
       Case Else
End Select
End SubPrivate Sub munconnect_Click() '连机
ReDim OUT(10) As Byte
OUT(0) = &HA5
OUT(1) = &H67
OUT(2) = &H35
OUT(3) = &H31
OUT(4) = &H31
OUT(5) = &H30
OUT(6) = &H2
OUT(7) = &H20
OUT(8) = &H10
OUT(9) = &H30
OUT(10) = &HA0
ReDim inbte(1)
aa(0) = &HAA
MSComm1.Output = aa
If inbte(0) = &H5A And inbte(1) = &H79 Then
   MSComm1.Output = OUT
 End If
End SubPrivate Sub Timer1_Timer()
aa(0) = &HAA
MSComm1.Output = aa
n = n + 1
If n > 5 And strbuff <> "5A79" Then
 Text8.BackColor = vbRed
 MsgBox "联机超时!请稍后重试"
 Timer1.Enabled = False
 Text8.BackColor = &H80000005  n = 0
 End If
End Sub

解决方案 »

  1.   

    Option Explicit
        Dim strbuff As String
        Dim inbte() As Byte
        Dim outdata As Variant
        Dim OUT() As Byte
        Dim n As Integer
        Dim aa(0) As Byte
        Dim indata As String
        Dim n1 As IntegerPrivate Sub Command1_Click()
        Timer1.Enabled = True
    End SubPrivate Sub Form_Load() '程序初始化
        With MSComm1
            .CommPort = 1
            .Settings = "38400,n,8,1"
            .OutBufferCount = 0
            .InBufferCount = 0
            .RThreshold = 1
            .InputMode = comInputModeBinary
            '.SThreshold = 0
            .OutBufferSize = 512
            .InBufferSize = 1024
            .InputLen = 0
            If Not .PortOpen Then            '判断通信口是否打开
                On Error Resume Next
                .PortOpen = True                '打开通信口
                  If Err Then                  '错误处理
                    MsgBox "串口被占用或此串口不存在!通信无效!", 16, "错误提示"
                    Exit Sub
                  End If
              End If
        End With
        Print MSComm1.CommPort
        Text8 = ""
    End Sub
    Private Sub mnuexit_Click() '退出程序
        Dim a
        a = MsgBox("您确定要退出系统吗?", vbOKCancel + vbQuestion, "提示")
        If a = 1 Then
            Unload Me
        Else
        Exit Sub
        End If
    End SubPrivate Sub MSComm1_OnComm() '接收事件
        Dim I As Integer
        Select Case MSComm1.CommEvent
            Case 2
                strbuff = MSComm1.Input
                inbte() = strbuff
                For I = 0 To UBound(inbte)
                        indata = indata & Right("0" & Hex(inbte(I)), 2)
                Next I
                If Mid(indata, 1, 4) = "5A79" Then
                    Text1 = indata
                    indata = ""
                    Timer1.Enabled = False
                    Timer2.Enabled = True
                ElseIf Mid(indata, 1, 8) = "35822010" Then '0X35,0X82,0X20,0X10
                    Text8.BackColor = vbGreen
                    indata = ""
                    Text8 = "连机OK!"
                    Timer2.Enabled = False
                End If
                MSComm1.InBufferCount = 0
            Case Else
        End Select
    End SubPrivate Sub munconnect_Click() '连机
    End SubPrivate Sub Timer1_Timer()
        aa(0) = &HAA
        MSComm1.Output = aa
        n = n + 1
        If n > 5 Then
            Text8.BackColor = vbRed
            Text8 = "联机超时!请稍后重试"
            Timer1.Enabled = False
            Text8.BackColor = &H80000005
            n = 0
        End If
    End SubPrivate Sub Timer2_Timer()
        ReDim OUT(10) As Byte
        OUT(0) = &HA5
        OUT(1) = &H67
        OUT(2) = &H35
        OUT(3) = &H31
        OUT(4) = &H31
        OUT(5) = &H30
        OUT(6) = &H2
        OUT(7) = &H20
        OUT(8) = &H10
        OUT(9) = &H30
        OUT(10) = &HA0
        MSComm1.Output = OUT
        n1 = n1 + 1
        If n1 > 5 Then
            Text8.BackColor = vbRed
            Text8 = "联机超时!请稍后重试"
            Timer1.Enabled = False
            Text8.BackColor = &H80000005
            n = 0
        End If
    End Sub
      

  2.   

     indata = indata & Right("0" & Hex(inbte(I)), 2)
    这句我有点看不懂,能解释一下吗
      

  3.   

    LZ:
    给你的代码没问题,请添加Timer2 
    并设置 
    Timer1和Timer2的Enabled属性为False 
    由 
    Private Sub Command1_Click() 
    Timer1.Enabled = True 
    End Sub 
    执行联机判断