我用MSComm做一个控制程序.可以发送数据.但只能收到一个字节的数据,且InputLen是为0的.
硬件肯定没问题的,用附带程序工作正常.我的程序在发送数据也正常,因为它能正确响应我的指令.但奇怪的是我的程序不能正确接收数据.当我发送查询指令时,正确是能收到两个字节的,但是我的程序只能收到一个字节(InputLen属性为0,郁闷~~). 
以下是初始化代码,其它均用默认值
    comm.CommPort = 1
    comm.RThreshold = 1
    comm.InputMode = comInputModeBinary
    comm.PortOpen = True
以下是接收代码
Private Sub comm_OnComm()
Dim bin() As Byte, buf As String
Dim x As Long
x = comm.InputLen
If x = 0 Then
    buf = comm.Input
Else
    For x = x To 0 Step -1
        buf = buf & comm.Input
    Next
End If
bin = buf
....

解决方案 »

  1.   

    应该判断 InBufferCount 属性
    这是我的一个接收程序,你可以参考一下
    Private Sub MSComm1_OnComm()
       '打开错误处理陷阱
       On Error GoTo ErrGoto
       '----------------------------------------------------
        Dim bytReceiveArray() As Byte        '接收数据缓冲区
        Static bytReceiveData() As Byte      '接收的数据
        Static intReceiveNum As Integer      '接收的数据个数
        Dim VarReceiveData As Variant        '接收的变体数据
        Dim CRC16H As Byte
        Dim CRC16L As Byte
        Static intGetDataLen As Integer      '接收数据的帧长度
        Dim lngTypeLen(0 To 3) As Long       '数据类型的长度
        
        Dim bytData As BYTEData
        Dim intData As INTEGERData
        Dim lngData As LONGData
        Dim sngData As SINGLEData
        
        Dim bytAddr As Byte
        Dim varData() As Variant
        Dim bytNum As Byte
        Dim bytType As Byte
        
        Dim i As Long
        Dim j As Long
                
        lngTypeLen(0) = 1
        lngTypeLen(1) = 2
        lngTypeLen(2) = 4
        lngTypeLen(3) = 4
        
        Static bFindDataTop As Boolean
        Dim lngDataLen As Long
       
       '数据接收
       If MSComm1.CommEvent = comEvReceive And MSComm1.InBufferCount > 0 Then
             
             '-------------------------------
             VarReceiveData = MSComm1.Input
             ReDim bytReceiveArray(0) As Byte
             bytReceiveArray = VarReceiveData
             lngDataLen = intReceiveNum + UBound(bytReceiveArray)
             ReDim Preserve bytReceiveData(0 To lngDataLen) As Byte
             For i = intReceiveNum To lngDataLen
                 bytReceiveData(i) = bytReceiveArray(i - intReceiveNum)
             Next
             intReceiveNum = lngDataLen + 1
             
             '-------------------------------
             '接收的数据个数大于2 且 没有找到数据头
             If intReceiveNum > 2 And bFindDataTop = False Then
                bytType = bytReceiveData(1)
                bytNum = bytReceiveData(2)
                
                '找到数据头
                If bytReceiveData(0) = &HAC And bytType < 4 Then
                  If lngTypeLen(bytType) * bytNum < 256 Then
                    '已找到数据头
                    bFindDataTop = True
                    '要接收的数据个数
                    intGetDataLen = bytNum * lngTypeLen(bytType) + 6
                  Else
                    CleanUpData intReceiveNum, bytReceiveData
                    bFindDataTop = False
                    Exit Sub
                  End If
                Else
                '没有找到数据头
                   CleanUpData intReceiveNum, bytReceiveData
                   bFindDataTop = False
                   Exit Sub
                End If
             End If
       
             
             '接收的数据个数等于或大于要接收的数据个数 且 已找到数据头
             If intReceiveNum >= intGetDataLen And bFindDataTop = True Then
                '--------------------------------------------
                bytType = bytReceiveData(1)
                bytNum = bytReceiveData(2)
                bytAddr = bytReceiveData(3)
                 
                Call CRC16(bytReceiveData, intGetDataLen - 2, CRC16H, CRC16L)
                'CRC16校验检验
                If CRC16H = bytReceiveData(intGetDataLen - 2) And CRC16L = bytReceiveData(intGetDataLen - 1) Then
                    '-----------------------------------------------------
                     ReDim varData(0 To bytNum - 1) As Variant
                     
                     Select Case bytType
                      Case 0   'byte
                        For i = 0 To bytNum - 1
                           varData(i) = bytReceiveData(i + 4)
                        Next
                        
                      Case 1   'integer
                        For i = 0 To bytNum - 1
                          For j = 0 To 1
                            bytData.bytData(j) = bytReceiveData(i * 2 + j + 4)
                          Next
                          LSet intData = bytData
                          varData(i) = intData.intData
                        Next
                        
                      Case 2   'long
                        For i = 0 To bytNum - 1
                          For j = 0 To 3
                            bytData.bytData(j) = bytReceiveData(i * 4 + j + 4)
                          Next
                          LSet lngData = bytData
                          varData(i) = lngData.lngData
                        Next
                      
                      Case 3   'single
                        For i = 0 To bytNum - 1
                          For j = 0 To 3
                            bytData.bytData(j) = bytReceiveData(i * 4 + j + 4)
                          Next
                          LSet sngData = bytData
                          varData(i) = sngData.sngData
                        Next
                       
                    End Select
                    '触发接收数据事件
                    RaiseEvent InceptData(bytAddr, varData, bytNum, bytType)
                Else
                    '清理数据
                    CleanUpData intReceiveNum, bytReceiveData
                    bFindDataTop = False
                    Exit Sub
                End If
                '--------------------------------------------
                '为下一帧数据整理数据头
                If intReceiveNum > intGetDataLen Then
                   CleanUpData intReceiveNum, bytReceiveData, intGetDataLen
                Else
                   intReceiveNum = 0
                End If
                
                bFindDataTop = False
             End If
             
       End If
       '----------------------------------------------------
       Exit Sub
       '-----------------------------
    ErrGoto:
       bFindDataTop = False
    End Sub