需要用MSComm控件进行串口通信,发送的命令为 十六进制的  chr(&H10) & chr(&H04) & chr(&H04) 接收返回的数据位 &H1E或者 &H7E,问题是,接收不到返回,代码如下:Private Sub Form_Load()MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.PortOpen = TrueEnd SubPrivate Sub command1_Click()
Dim selfcheck As String
selfcheck = Chr(&H10) & Chr(&H4) & Chr(&H4)
MSComm1.Output = selfcheck
End Sub
Private Sub MSComm1_OnComm()
Dim inbuff As String
Select Case MSComm1.CommEvent
Case comEvReceive
inbuff = MSComm1.Input
MsgBox inbuff
End Select
End Sub

解决方案 »

  1.   

    1、就你的代码而言,是错误的,正确的应该如下:Option Explicit
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.InputMode = comInputModeBinary
        MSComm1.RThreshold = 1
        MSComm1.InBufferSize = 1024
        MSComm1.InBufferCount = 0
        MSComm1.OutBufferSize = 100
        MSComm1.OutBufferCount = 0
        If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
    End SubPrivate Sub command1_Click()
        Dim bytOut(0 To 2) As Byte
        bytOut(0) = &H10
        bytOut(1) = &H4
        bytOut(2) = &H4
        MSComm1.Output = bytOut
    End Sub
    Private Sub MSComm1_OnComm()
        Dim strInput As String
        Dim intP As Integer
        Dim varP As Variant
        Select Case MSComm1.CommEvent
            Case comEvReceive
                MSComm1.RThreshold = 0
                For intP = 1 To MSComm1.InBufferCount
                    varP = Null
                    varP = MSComm1.Input
                    strInput = strInput & Right("00" & Hex$(varP(0)), 2)
                Next intP
                MsgBox strInput
                MSComm1.RThreshold = 1
        End Select
    End Sub2、检查一下你的连线,端口设置(波特率、校验方式等等),通信协议是否理解错误
      

  2.   

    同意二楼的。但是我觉着二楼的代码中 应该把COMM的参数设置和串口打开程序放到command1_Click中
    在MSComm1_OnComm()中,最后,关闭串口。这样对串口的调用比较合理
      

  3.   

    非常感谢!学习了Private Sub Command1_Click()
    Dim OutBuffer() As Byte
    Dim tem As Variant
    Dim e As Integer
    Dim q As Integer
    Dim LenOfText As Integer
    LenOfText = Len(Text2.Text) \ 2 - 1
    ReDim OutBuffer(LenOfText)              If MSComm1.PortOpen = False Then
                    MSComm1.PortOpen = True
                  End If
                      
                  q = 0
                  For e = 1 To Len(Text2.Text) Step 2
                                  tem = Mid(Text2.Text, e, 2)
                                  OutBuffer(q) = Val("&H" & tem)
                                  Debug.Print Val("&H" & tem)
                                  q = q + 1
                  Next
                      
                  MSComm1.Output = OutBuffer
                
    End SubPrivate Sub Form_Load()
    Text2.Text = "100404" '发送的命令
    MSComm1.CommPort = 1  '固定为串口com1
    MSComm1.Settings = "9600,N,8,1"  '设置Settings属性
    MSComm1.InputMode = comInputModeBinary '访属性用于设置或者返回传输数据的类型 ComInputModeText文本  comInputModeBinary二进制
    MSComm1.InputLen = 0  '该属性用于设置并返回Input属性从接收缓冲区读取的字符数  当设置InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部的内容。
    MSComm1.InBufferSize = 1024   '用于设置或返回输入缓冲区的大小,默认值为1024字节。MSComm1.OutBufferSize = 512 '属性用于设置或者返回发送缓冲区的大小,值为整形表达式,表示传输缓冲区的字节数,默认值为512字节。
    MSComm1.PortOpen = True '打开串口
    MSComm1.SThreshold = 0 '设置并返回传输缓冲区中允许的最小字符数。如果Sthreshold等于5,仅当在输出队列中字符数从5降到4时,comEvSend才发生。如果在输出队列中从没有比Sthreshold多的字符,comEvSend事件将绝不会发生。MSComm1.RThreshold = 1 '若RThreshold属性设置为0(默认值)则不会产生OnComm事件。否则,该属性为一阈值,当接收缓冲区内字节个数达到或超过该值后就会产生OnComm事件,例如,设置RThreshold为1,接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。MSComm1.InBufferCount = 0  '用于返回输入缓冲区内的等待读取的字节个数,可以通过该属性值为0来清除接收缓冲区。MSComm1.OutBufferCount = 0 '清除发送缓冲区
    End Sub
    Private Sub MSComm1_OnComm()
        On Error Resume Next
        Dim BytesReceived() As Byte
        Dim buffer As String
        Dim HData As String
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive               '接收十六进制数据。并以十六进制显示
                MSComm1.InputLen = 0
                buffer = MSComm1.Input                  '接收数据至字符串中
                BytesReceived() = buffer                '将数据转入Byte数组中
                For i = 0 To UBound(BytesReceived)      '显示结果以十六进制显示
                    If Len(Hex(BytesReceived(i))) = 1 Then
                        HData = HData & "0" & Hex(BytesReceived(i))
                    Else
                        HData = HData & Hex(BytesReceived(i))
                    End If
                    Text1.Text = HData
                    '最后将结果后入Text1中
                    MSComm1.OutBufferCount = 0      '清除发送缓冲区
                    MSComm1.InBufferCount = 0       '清除接收缓冲区
                   MSComm1.PortOpen = False
                Next
        End Select
    End Sub
     
      

  4.   

    楼主,不用那么麻烦吧?OnComm事件中不需要清除什么OutBufferCount等,那样可能还要出问题。
    还有串口可以一直开着,直到关闭程序时载关闭它即可。
    代码要力求简洁,多余的不要写了。