'这是自动发送1秒/次
Private Sub Timer1_Timer()
On Error Resume Next
    Me.Timer1.Enabled = False
    Dim bytData1(0) As Byte
    Dim bytData(21) As Byte
    Dim i As Integer
    bytData1(0) = 9
    bytData(0) = 3
    bytData(20) = 12
    bytData(21) = 136
    MSComm1.Settings = "19200,m,8,2"
    Call SendData(bytData1)  '发送命令
    MSComm1.Settings = "19200,s,8,2"
    
    Call SendData(bytData)
    Me.Timer1.Enabled = True
End Sub
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Resume NextMSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.Output = bytData '发送数据Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0          '清空发送缓冲区
End Function
'以下是我的自动接收.10/MS
Private Sub Timer2_Timer()
On Error Resume Next
Dim BytesReceived() As Byte
Dim buffer As String
Dim HData As Variant
Dim i As Integer
    Me.Timer2.Enabled = False
    MSComm1.Settings = "19200,m,8,2"        '改变MSComm.Settings值
    DoEvents
    Select Case MSComm1.CommEvent
            Case comEvReceive               '接收十六进制数据。并以十六进制显示
            
                If MSComm1.InBufferCount <= 0 Then
                    Me.Timer2.Enabled = True
                    Exit Sub
                End If
                    
                MSComm1.InputLen = 0
                MSComm1.InputMode = comInputModeBinary  '设置当前以二进制数接收数据
                buffer = MSComm1.Input                  '接收数据至字符串中
                BytesReceived() = buffer                '将数据转入BYTE中
            
                For i = 0 To UBound(BytesReceived)      '显示结果以十六进制显示
                    If Len(Hex(BytesReceived(i))) = 1 Then
                        HData = 0 & Hex(BytesReceived(i))
                    Else
                        HData = Hex(BytesReceived(i))
                    End If                    MSComm1.OutBufferCount = 0      '清除发送缓冲区
                    MSComm1.InBufferCount = 0       '清除接收缓冲区
                    Text1.Text = HData       '最后将结果后入Text1中
                Next
    End Select
    Me.Timer2.Enabled = True
End Sub程序发送第一组数据以M发送.以后以S发送.接收以S接收程序设置是发送1秒一次.接收也是1秒一次.可是接收到的数据全部3F.
如果我将发送设置1秒一次.接收10豪秒一次.接收大部份情况正常.还有就是当我连续发送多条数据时返回来的结果又是3F.
请问我这段程序错误在哪里?
以上是我的接收与发送程序.万分感谢.在线等.谢谢

解决方案 »

  1.   

    发送接收分离; 
    MSComm1.Settings = "19200,s,8,2"  
    前加一个适当的延时。
      

  2.   

    代码修改如下:Private Sub Form_Load()
    Me.MSComm1.CommPort = 2
    Me.MSComm1.PortOpen = True
    Me.MSComm1.RThreshold = 1
    End SubPrivate Sub MSComm1_OnComm()
    On Error Resume Next
    Dim BytesReceived() As Byte
    Dim buffer As String
    Dim HData As String
    Dim i As Integer
        'Me.Timer2.Enabled = False
        MSComm1.Settings = "19200,m,8,2"        '改变MSComm.Settings值
        DoEvents
        Select Case MSComm1.CommEvent
                Case comEvReceive               '接收十六进制数据。并以十六进制显示
                
                    If MSComm1.InBufferCount <= 0 Then
                        Me.Timer2.Enabled = True
                        Exit Sub
                    End If
                        
                    'MSComm1.InputLen = 0
                    MSComm1.InputMode = comInputModeBinary  '设置当前以二进制数接收数据
                    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       '清除接收缓冲区
                    Next
        End Select
        'Me.Timer2.Enabled = TrueEnd SubPrivate Sub Timer1_Timer()
    On Error Resume Next
        'Me.Timer1.Enabled = False
        Dim bytData1(0) As Byte
        Dim bytData(21) As Byte
        Dim i As Integer
        bytData1(0) = 9
        bytData(0) = 3
        bytData(20) = 12
        bytData(21) = 136
        MSComm1.Settings = "19200,m,8,2"
        Call SendData(bytData1)  '发送命令
        MSComm1.Settings = "19200,s,8,2"
        Call SendData(bytData)
        'Me.Timer1.Enabled = True
    End Sub
    Public Function SendData(ByRef bytData() As Byte) As Long
    On Error Resume NextMSComm1.InBufferCount = 0 '清空接收缓冲区
    MSComm1.Output = bytData '发送数据Do
    DoEvents
    Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
    MSComm1.OutBufferCount = 0          '清空发送缓冲区
    End Function
    '以下是我的自动接收.10/MS
    Private Sub Timer2_Timer()
        'Me.Timer2.Enabled = True
    End Sub
      

  3.   

    网友of123() 在http://community.csdn.net/Expert/topic/5397/5397147.xml?temp=.3779718的答复你可仔细阅读,在改变MSCOMM的属性SETTING前需关闭串口,改变后再打开串口.