'-----------------------------------------------------
'发送区
'-----------------------------------------------------
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
'-----------------------------------------------------
'接收区
'-----------------------------------------------------
Private Sub MSComm1_OnComm()
On Error Resume Next
    Dim BytReceived() As Byte
    Dim strBuff As String
    Dim strData As Variant
    Dim i As Integer
    Dim x As Integer
    Select Case MSComm1.CommEvent
            Case 2
                MSComm1.Settings = "19200,M,8,2"
                MSComm1.InputLen = 0
                strBuff = MSComm1.Input
                BytReceived() = strBuff
                For i = 0 To UBound(BytReceived)
                    If Len(Hex(BytReceived(i))) = 1 Then
                        strData = 0 & Hex(BytReceived(i))
                    Else
                        strData = Hex(BytReceived(i))
                    End If
                Next
                Text1.Text = Text1.Text
               MSComm1.OutBufferCount = 0   '清空发送缓冲区
               MSComm1.InBufferCount = 0    '清空接收缓冲区
        
                
    End Select
End Sub'---------------------------------------
'发送数据
'---------------------------------------
Private Sub cmdConnect_Click()Dim bytData1(0) As Byte
Dim bytData(21) As Byte
Dim i As Integer
    MSComm1.CommPort = 1                   'COM端口
    MSComm1.Settings = "19200,m,8,2"
    MSComm1.InputMode = comInputModeBinary      '采用二进制传输
    MSComm1.InBufferCount = 0   '清空接受缓冲区
    MSComm1.OutBufferCount = 0  '清空传输缓冲区
    MSComm1.SThreshold = 1      '如果传输缓冲区完全空时产生MSComm事件
    MSComm1.RThreshold = 1      '不产生MSComm事件
    MSComm1.PortOpen = True     '打开端口bytData1(0) = 8
bytData(20) = 8
bytData(21) = 128
For i = 1 To 19
    bytData(i) = 0
Next
MSComm1.Settings = "19200,m,8,2"        '改变奇偶校验
Call SendData(bytData1)                 '发送
MSComm1.Settings = "19200,s,8,2"        '改变奇偶校验
Call SendData(bytData)                  '发送
End Sub
当我改变MSComm1.Settings 值后发送没问题,硬件收到信息。可是接收到的数据全部都是3F,我代码全部在这里。请问我的问题出的哪里?该如何解决。解决后100分。不给是小狗

解决方案 »

  1.   

    已将你在另一处提问的代码修改,经VB6调试通过: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
      

  2.   

    Do
    DoEvents
    Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
    MSComm1.OutBufferCount = 0
    这些代码不要,也没问题吧,
    我以前也用过,用这个话,CUP用的很多的
      

  3.   

    我调试时strBuff = MSComm1.Input
    到这里是我用监视看strBuff显示的是一个问题,我监视MSComm1.Input中的值是63(这63是十进制的转十六进制后就是3F),而且我发送任何值出去返回来的都是3F.感到很奇怪.
      

  4.   

    Option Explicit'-----------------------------------------------------
    '发送区
    Public Function SendData(ByRef bytData() As Byte) As Long
        On Error Resume Next
        MSComm1.InBufferCount = 0 '清空接收缓冲区
        MSComm1.Output = bytData '发送数据
        Do
            DoEvents
        Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
        MSComm1.OutBufferCount = 0
    End Function
    '增加Form_Load事件,将cmdConnect_Click事件中的部分代码移到Form_Load事件中,以避免串口多次打开错误
    Private Sub Form_Load()
        MSComm1.CommPort = 1                   'COM端口
        MSComm1.Settings = "19200,m,8,2"
        MSComm1.InputMode = comInputModeBinary      '采用二进制传输
        MSComm1.InBufferCount = 0   '清空接受缓冲区
        MSComm1.OutBufferCount = 0  '清空传输缓冲区
        MSComm1.SThreshold = 1      '如果传输缓冲区完全空时产生MSComm事件
        MSComm1.RThreshold = 1      '不产生MSComm事件
        MSComm1.PortOpen = True     '打开端口
    End Sub'接收区
    Private Sub MSComm1_OnComm()
    On Error Resume Next
        Dim BytReceived() As Byte
        Dim strBuff As String
        Dim strData As String
        Dim i As Integer
        Dim x As Integer
        Select Case MSComm1.CommEvent
            Case 2
                MSComm1.Settings = "19200,M,8,2"
                MSComm1.InputLen = 0
                strBuff = MSComm1.Input
                BytReceived() = strBuff
                For i = 0 To UBound(BytReceived)
                    If Len(Hex(BytReceived(i))) = 1 Then
                        strData = strData & "0" & Hex(BytReceived(i)) '此行修改
                    Else
                        strData = strData & Hex(BytReceived(i)) '此行修改
                    End If
                Next
                Text1.Text = strData '此行修改,原Text1.Text = Text1.Text
                MSComm1.OutBufferCount = 0   '清空发送缓冲区
                MSComm1.InBufferCount = 0    '清空接收缓冲区
        End Select
    End Sub'---------------------------------------
    '发送数据
    Private Sub cmdConnect_Click()
        Dim bytData1(0) As Byte
        Dim bytData(21) As Byte
        Dim i As Integer
        bytData1(0) = 8
        bytData(20) = 8
        bytData(21) = 128
        For i = 1 To 19
            bytData(i) = 0
        Next
        MSComm1.Settings = "19200,m,8,2"        '改变奇偶校验
        Call SendData(bytData1)                 '发送
        MSComm1.Settings = "19200,s,8,2"        '改变奇偶校验
        Call SendData(bytData)                  '发送
    End Sub
      

  5.   

    不了解硬件方是怎么做的,但是单看软件部分,第二次改变校验时,并不能保证上一次的发送肯定已经结束,因为WIN是个多任务系统,基本上在DOEVENTS的时候,程序已经在执行下一句“MSComm1.Settings = "19200,s,8,2"”了。Public Function SendData(ByRef bytData() As Byte) As Long
    MSComm1.InBufferCount = 0 '清空接收缓冲区
    MSComm1.Output = bytData '发送数据Do
    DoEvents     ;**********
    Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
    MSComm1.OutBufferCount = 0;--------------------------------------------------------------MSComm1.Settings = "19200,m,8,2"        '改变奇偶校验
    Call SendData(bytData1)                 '发送
    MSComm1.Settings = "19200,s,8,2"        '改变奇偶校验*******
    Call SendData(bytData)                  '发送
      

  6.   

    改变校验应该mscomm的发送结束中断事件里改。在这里判断发送缓冲空是最及时和有效的。
      

  7.   

    我觉得我的发送数据是没有问题的.因为我发送数据出去后我下面的机器提示我已经与他相连
    我的硬件是这样设置的.一条记录一共有23组数据.第一组数据以19200,M,8,2发送.后面的22组以19200,S,8,2发送.发完一条数据后下面的硬件会返回来一个值以确定这条数据是否正确.现在的问题是我发给硬件这条数据硬件给出反映提示已连接上.返回来一个值.可是这个返回来的值都是3F.我感觉到很郁闷.我在想是否我的接收数据有问题?还是我的Timer控件有问题?我Timer控件设置的是1秒发一条数据.
      

  8.   

    http://community.csdn.net/Expert/topic/5383/5383313.xml?temp=.1498224
    请参阅上述网址下本人2007-3-8 18:20:24 及2007-3-8 18:21:34 的答复的代码,调试正常的简化串口调试精灵代码,用16进制编写命令于txtSend。运行它来观察返回的命令究竟是否符合要求。
      

  9.   

    正常的话硬件分别返回什么?第一组以及第二至第二十三组?
    看看zdingyun的代码应该是正确的.
      

  10.   

    问题我已经知道出在哪里了。我是用MSCOMM控件接收数据的。是Timer问题
    用Timer1发送数据,可是接收时我必须把奇偶改回19200,M,8,2
    正如上面所说windows是多线程工作。当我在收数据时同时也在发数据,而发数据可能会改成19200,S,8,2所以就出现了所谓的3F现象。现在我要控制的问题是当我在接收数据时Timer1一定不能发数据。
    可是这个时间我怎么就是控制不住。
    有办法吗?
      

  11.   

    用MSCOMM和硬件通讯需要注意时序匹配问题,发送不要用TIMER,在接收中断里发送,用TIMER做接收超时判断。19200bps下发送/接收一个字节(11位)约550微秒,看看几个字节,加点硬件处理时间,可以计算出TIMER的定时所需时长。
      

  12.   

    那我想问问楼上的。
    如果我要隔一段时间发送一条数据给硬件当前与它连接。
    如果不用Timer控件。用什么处理最合适???
      

  13.   

    请核查返回数据的字节长度是否一致。如果是等长的话,可设置MSCOMM控件的属性RThreshold位固定值(等于返回数据字节长度),这样可保证在完成接收时MSCOMM的属性Settings不至于发生变化。
    TIMER控件的Enabled 在 False 和 True 间交替改变。
    此种用法需增加1TIMER控件,将其属性Interval设置在30000左右,用于自动卸载通讯窗体模块。在其它的主窗体再用代码提及通讯窗体的任一控件属性来加载到内存。这样做的目的是避免接收出错而程序死,以保证通信正常。
      

  14.   

    这需要把硬件方的串口工作方式列出来,因为到目前为止,问题仅限于用MSCOMM来适应硬件串口的时序和工作方式。说实话,如果不是硬件有地址识别功能的话,没事改串口参数是件比较困惑的事。
      

  15.   

    Private Sub cmdConnect_Click()Dim bytData1(0) As Byte
    Dim bytData(21) As Byte
    Dim i As Integer
    bytData1(0) = 8
    bytData(20) = 8
    bytData(21) = 128MSComm1.Settings = "19200,m,8,2"
    Call SendData(bytData1)  '发送命令
    MSComm1.Settings = "19200,s,8,2"
    Call SendData(bytData)End Sub
    '********Private Sub MSComm1_OnComm()
    On Error Resume Next
        Dim BytReceived() As Byte
        Dim strBuff As String
        Dim strData As Variant
        Dim i As Integer    Select Case MSComm1.CommEvent
                Case 2
                   
                    MSComm1.Settings = "19200,M,8,2"                MSComm1.InputLen = 0    '读取缓冲区中所有字符
                    strBuff = MSComm1.Input
                    BytReceived() = strBuff
                    For i = 0 To UBound(BytReceived)
                        If Len(Hex(BytReceived(i))) = 1 Then
                            strData = 0 & Hex(BytReceived(i))
                        Else
                            strData = Hex(BytReceived(i))
                        End If
                    Next
                    Text1.Text = Text1.Text & " " & strData & vbCrLf
                    
                    MSComm1.OutBufferCount = 0   '清空发送缓冲区
                    MSComm1.InBufferCount = 0    '清空接收缓冲区
            
                    
        End Select
        
    End Sub我没有用TIMER控件控制为什么结果还是3F呢?真的把我急死了
    请会的朋友帮帮我。一个人开发不容易啊。而且我刚刚上岗不久。先谢谢了。解决了一定给分
      

  16.   

    另外,如果发送总是用同一种校验,接收总是用另一种校验,那么只需要设置SETTINGS为发送时的校验,而接收时只取数据,忽略其中的校验错信息。MSCOMM不会因为校验错而改变接收的有效的8位数的。
      

  17.   

    我使用的串口只使用了三根线。一根接收线。一根发送线。一根地线。
    没有使用握手协议
    我发送一条数据给硬件是一个数组。这数组中有23个元素。
    第一个元素以19200,M,8,2发送以后的22个元素以19200,S,8,2发送。发送完之后硬件会在10豪秒之内传回一个值。传回来的值以19200,M,8,2接收。这个值是一个十六进制数。别的就没有了。能给我写段代码吗?非常感谢。我是一对一的通信(就是计算机串口直接对一台设备设置)。速度应该很快。
      

  18.   

    Private Sub MSComm1_OnComm()
    On Error Resume Next
        Dim BytReceived() As Byte
        Dim strBuff As String
        Dim strData As String
        Dim i As Integer
        Dim x As Integer
        Select Case MSComm1.CommEvent
            Case 2
                MSComm1.Settings = "19200,M,8,2"
                MSComm1.InputLen = 0
                strBuff = MSComm1.Input
                BytReceived() = strBuff
                For i = 0 To UBound(BytReceived)
                    If Len(Hex(BytReceived(i))) = 1 Then
                        strData =  "0" & Hex(BytReceived(i)) '此行修改
                    Else
                        strData =  Hex(BytReceived(i)) '此行修改
                    End If
                Next
                '增加判别代码
                If strData = "0F" Or strData = "F0" Then
                    Text1.Text = Text1.Text & " " & strData & vbCrLf
                    MSComm1.OutBufferCount = 0   '清空发送缓冲区
                    MSComm1.InBufferCount = 0 '清空接收缓冲区
                Else
                End If
        End Select
    End Sub
      

  19.   

    中途改变 Settings 之前,关闭 MSComm 控件,然后再打开。这样会比较慢,如果要求速度,可以用 API 来做。'-----------------------------------------------------
    '发送区
    '-----------------------------------------------------
    Public Function SendData(ByRef bytData() As Byte) As Long
    On Error Goto ErrHandlerMSComm1.Output = bytData '发送数据Do
    DoEvents
    Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
    SendData = 0
    Exit FunctionErrHandler:
    SendData = Err.Number
    End Function'-----------------------------------------------------
    '接收区
    '-----------------------------------------------------
    Private Sub MSComm1_OnComm()
    On Error Resume Next
        Dim BytReceived() As Byte
        Dim strBuff As Variant
        Dim i As Integer
        Select Case MSComm1.CommEvent
                Case 2
                    MSComm1.InputLen = 0
                    strBuff = MSComm1.Input      '必须用 Variant 变量接收二进制值
                                                 '否则中文系统将其改为“?”= Chr(&H3F)
                    BytReceived() = strBuff
                    For i = 0 To UBound(BytReceived)
                        Text1.Text = Text1.Text & " " Right("0" & Hex(BytReceived(i),2) 
                    Next
        End Select
    End Sub'---------------------------------------
    '发送数据
    '---------------------------------------
    Private Sub cmdConnect_Click()Dim bytData1(0) As Byte
    Dim bytData(21) As Byte
    Dim i As Integer
        MSComm1.CommPort = 1                   'COM端口
        MSComm1.Settings = "19200,m,8,2"
        MSComm1.InputMode = comInputModeBinary      '采用二进制传输
        MSComm1.InBufferCount = 0   '清空接受缓冲区
        MSComm1.OutBufferCount = 0  '清空传输缓冲区
        MSComm1.SThreshold = 1      '如果传输缓冲区完全空时产生MSComm事件
        MSComm1.RThreshold = 1      '不产生MSComm事件bytData1(0) = 8
    bytData(20) = 8
    bytData(21) = 128
    For i = 1 To 19
        bytData(i) = 0
    NextMSComm1.Settings = "19200,m,8,2"        '改变奇偶校验
    MSComm1.PortOpen = True     '打开端口
    Call SendData(bytData1)                 '发送
    MSComm1.PortOpen = False     '关闭端口
    MSComm1.Settings = "19200,s,8,2"        '改变奇偶校验
    MSComm1.PortOpen = True     '打开端口
    Call SendData(bytData)                  '发送
    MSComm1.PortOpen = False     '关闭端口
    MSComm1.Settings = "19200,m,8,2"        '改变奇偶校验
    MSComm1.PortOpen = True     '打开端口
    End Sub
      

  20.   

    Text1.Text = Text1.Text & " " Right("0" & Hex(BytReceived(i)),2)