在某位高手的帮助下我这个初学者自己编写了这个程序,但是调试时发现接收不到数据,请各位看看,哪儿出问题了?(估计问题挺多~)发送数据1A,60,04       需接收到数据 1B,61,4x,04(x=1或2)
发送数据1A,64,04       需接收到数据1B,64,31,31,31,04以下是我的程序(因为每次发送和接收的字节数不固定,所以就下不了手了)'初始化
Private Sub Form_Load()
MSComm1.CommPort = 1 '选择通道1
MSComm1.Settings = "4800,n,8,1"
MSComm1.InputMode = CommInputModeText 'ASCII接收
MSComm1.RThreshold = 2 '接受缓冲区每收到2个字符产生oncomm事件
MSComm1.SThreshold = 1 '传输缓冲区为空时产生oncomm事件
MSComm1.PortOpen = True '打开端口
End SubPrivate Sub selfcheck_Click()
Dim selfcheck As String
selfcheck = "1A" & "60" & "04"
MSComm1.Output = selfcheck
End Sub'发送校准请求
Private Sub 校准请求_Click()
Dim Calibration As String
Calibration = "1A" & "64" & "04"
MSComm1.Output = Calibration
End SubPrivate Sub MSComm1_OnComm()
Dim inbuff As String
Select Case MSComm1.CommEvent
Case comEvReceive
inbuff = MSComm1.Input
'读取自检信号
If Mid(inbuff, 1, 2) = "1B" And Right(inbuff, 2) = "04" Then '数据判断处理
     Text1 = inbuff
   If Mid(inbuff, 5, 2) = "41" Then
    自检结果显示.Caption = "normal"
   ElseIf Mid(inbuff, 5, 2) = "42" Then
    自检结果显示.Caption = "RAM Error"
   ElseIf Mid(inbuff, 5, 3) = "43" Then
     自检结果显示.Caption = "ROM Error"
   End If
End If
'接收校准信号
If Mid(inbuff, 1, 2) = "1B" And Mid(inbuff, 3, 2) = "64" And Right(inbuff, 2) = "04" Then
Text1 = inbuff
Text4.Text = Mid(inbuff, 5, 6)
End If
End Select
End Sub

解决方案 »

  1.   

    使用MSComm控件,按2进制方式接收。
    Option Explicit
        Dim strHex As String
    Private Sub Form_Load()
        'MSComm1初始化
        MSComm1.CommPort = 1
        MSComm1.Settings = "4800,n,8,2"
        MSComm1.InputMode = comInputModeBinary '2进制接收
        MSComm1.RThreshold = 1
        MSComm1.PortOpen = True
    End SubPrivate Sub MSComm1_OnComm()
        Dim inbuff() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
                inbuff = MSComm1.Input
                For i = 0 To UBound(inbuff) '将接收的Byte字节流转换为16进制字符串
                    strHex = strHex & Right("0" & Hex(inbuff(i)), 2)
                Next
                If Mid(strHex, 1, 2) = "1B" And Len(strHex) = 8 Then '数据判断及处理
                      Text1 = strHex
                    If Mid(strHex, 5, 2) = "41" Then
                        Label1.Caption = "normal"
                    ElseIf Mid(strHex, 5, 2) = "42" Then
                        Label1.Caption = "RAM Error"
                    ElseIf Mid(strHex, 5, 2) = "43" Then
                        Label1.Caption = "ROM Error"
                    End If
                    strHex = ""
                End If
        End Select
    End SubPrivate Sub Command1_Click() '发送自检请求命令
        Dim sendsj(2) As Byte
        sendsj(0) = &H1A
        sendsj(1) = &H60
        sendsj(2) = &H4
        MSComm1.Output = sendsj
    End SubPrivate Sub Command2_Click()
        End
    End Sub
      

  2.   

    Option Explicit
        Dim strSj As String
        Dim bj As String * 2
    Private Sub Form_Load()
        'MSComm1初始化
        MSComm1.CommPort = 1
        MSComm1.Settings = "4800,n,8,2"
        MSComm1.InputMode = comInputModeText 'ASCII接收
        MSComm1.RThreshold = 1
        MSComm1.PortOpen = True
    End SubPrivate Sub MSComm1_OnComm()
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
                strSj = strSj & MSComm1.Input
                Text1 = strSj
                If Mid(strSj, 1, 4) = "1B61" And Mid(strSj, 7, 2) = "04" Then  '数据判断及处理
                    If Mid(strSj, 5, 2) = "41" Then
                        Label1.Caption = "normal"
                    ElseIf Mid(strSj, 5, 2) = "42" Then
                        Label1.Caption = "RAM Error"
                    ElseIf Mid(strSj, 5, 2) = "43" Then
                        Label1.Caption = "ROM Error"
                    End If
                    strSj = ""
                ElseIf Mid(strSj, 1, 4) = "1B64" And Mid(strSj, 11, 2) = "04" Then
                    Text2 = strSj
                    strSj = ""
                End If
        End Select
    End SubPrivate Sub Command1_Click() '发送自检请求命令
        Dim sendsj As String
        sendsj = "1A6004"
        'bj = Mid(sendsj, 3, 2)
        MSComm1.Output = sendsj
    End SubPrivate Sub Command2_Click()
        Dim sendsj As String
        sendsj = "1A6404"
        'bj = Mid(sendsj, 3, 2)
        MSComm1.Output = sendsj
    End Sub
      

  3.   

    看到你上面的程序了~我有个问题:第三行的定义语句 Dim bj As string *2中的*2是什么意思?还有我发现后面好像没有实际用到bj,请问为什么要定义它
      

  4.   

    不好意思我还有个问题,按照你上面的程序来看,是接受到一个字符就读取它呢还是接收到全部字符再读取?因为每次接收的字符长度不同,所以如何判断何时产生oncomm 事件呢?
      

  5.   

    这是我解决你在VBGOOD时做的代码.放这儿没将Dim bj As string * 2删除.因为你叙述的通信协议有改变.
    发送数据1A,60,04      需接收到数据 1B,61,4x,04(x=1或2),发60 回61
    原来发送数据1A,60,04      需接收到数据 1B,60,4x,04(x=1或2),发60 回60Dim bj As string * 2
    这是定义1个2字节的string变量,节省内存占用.

    数据类型概述
    String 
    (变长) 10 字节加字符串长度 0 到大约 20 亿 
    String
    (定长) 字符串长度 1 到大约 65,400 
      

  6.   

    持续接收,按接收的数据尾字节判断.接收正确后数据处理,并清除即strSj = ""
      

  7.   

    能再问个问题伐?因为要发送和接收的东西比较多,要oncomm下面写的内容比较多,有状态监测和出错处理。所以我想采用一个调用,来调用包括自检的处理等等,但不是很确定语句该如何写,能给个例子么?又要麻烦你了~~
      

  8.   

    调用过程处理oncomm下面写的内容是可以的。
    不是很确定语句那是无法写的。
    实际你把oncomm下面写的内容,放一个过程,就是注意变量的作用域。
      

  9.   

    MSComm1.InputMode = CommInputModeText 'ASCII接收 
    这句错误,改为二进制方式