我用MSComm控件接收下位机给我的34字节数据,但是好像没有接收到数据,不知道在哪有问题。我的设置和代码如下
    With MSComm1
        .CommPort = 1
        .Settings = "9600,n,8,1"
        .InBufferCount = 0
        .InputLen = 0
        .RThreshold = 1   '32768
        .InputMode = comInputModeBinary '以2进制接收
        .PortOpen = True
    End WithSelect Case MSComm1.CommEvent
        Case comEvReceive
        MSComm1.RThreshold = 0
        m = Timer
        While Timer - m < 0.038         '从0.01到0.02(20sm)做延时
        Wend
        inByte = MSComm1.Input
        
        For i = 0 To UBound(inByte)
        If Len(Hex(inByte(i))) = 1 Then
            str1 = 0 & Hex(inByte(i))
        Else
            str1 = Hex(inByte(i))
        End If
            StrData = StrData & str1
        Next
            MSComm1.RThreshold = 1
    End Select
请大家帮我看看问题在什么地方啊!

解决方案 »

  1.   

    你使用过串口调试器调试过吗?这样可以排除硬件设置和连线的问题你的哪个inByte是什么类型?Byte类型?数组?我觉得你最好是这样改:Option Explicit
    Dim varP As Variant
    With MSComm1
        .CommPort = 1
        .Settings = "9600,n,8,1"
        .InBufferCount = 0
        .InputLen = 1           '把这个修改为1,每次读一个字节,便于读出处理
        .RThreshold = 1  '32768
        .InputMode = comInputModeBinary '以2进制接收
        .PortOpen = True
    End WithSelect Case MSComm1.CommEvent
        Case comEvReceive
            MSComm1.RThreshold = 0
            m = Timer
            While Timer - m < 0.038        '从0.01到0.02(20sm)做延时
            
            Wend
            Do
                sleep 1     '请加入API函数Sleep的声明,用于延迟,以便下位机没有传上来的数据传上来
                varP = Null
                varP = MSComm1.Input
                str1 = str1 & Right("00" & Hex(varP(0)), 2) '读出通信内容
            Loop Until MSComm1.InBufferCount = 0
            MSComm1.RThreshold = 1
    End Select
      

  2.   

    当然如果你的数据在等待了20ms后全部上来了,哪个Sleep是可以去掉的,这个你得在具体的调试中摸索
      

  3.   

    我用串口助手试了,下位机确实发送数据了,但是我用这个感觉没有收到,因为我用
    text13 = strdata
    下位机发送时text13没有显示内容
    楼上的        m = Timer
            While Timer - m < 0.038        '从0.01到0.02(20sm)做延时
    这个就是个延时,为什么后边还要加个延时呢?
      

  4.   

    如果你的延迟够了,当然就不用再加延迟了,不过这个得你自己调试确认一下,可以把Sleep去掉
      

  5.   

    单步调试一下,看看有没有触发OnComm事件
      

  6.   

    在设置代码段中设置一个断点,看程序运行时是否正确设置了。(这段代码是在 Form_Load 中吗?)在 OnComm 事件中也设置一个断点,看是否触发。同时看看 UBound(inByte) 是多少。
      

  7.   

    嗯这段代码是在Form_Load中
        With MSComm1 
            .CommPort = 1 
            .Settings = "9600,n,8,1" 
            .InBufferCount = 0 
            .InputLen = 0 
            .RThreshold = 1  '32768 
            .InputMode = comInputModeBinary '以2进制接收 
            .PortOpen = True 
        End With 
    下边的是在OnComm事件中
    Select Case MSComm1.CommEvent 
            Case comEvReceive 
            MSComm1.RThreshold = 0 
            m = Timer 
            While Timer - m < 0.038        '从0.01到0.02(20sm)做延时 
            Wend 
            inByte = MSComm1.Input 
            
            For i = 0 To UBound(inByte) 
            If Len(Hex(inByte(i))) = 1 Then 
                str1 = 0 & Hex(inByte(i)) 
            Else 
                str1 = Hex(inByte(i)) 
            End If 
                StrData = StrData & str1 
            Next 
                MSComm1.RThreshold = 1 
        End Select 
      

  8.   

    我这样检查了一下发现下边的问题
    Private Sub MSComm1_OnComm()
    Dim inByte() As Byte, byt As Byte, bytsj() As Byte
    Dim i As Integer
    Dim strData As String, str1 As String, m As String
    Select Case MSComm1.CommEvent
            Case comEvReceive
            MSComm1.RThreshold = 0
            m = Timer
            While Timer - m < 0.038         '从0.01到0.02(20sm)做延时
            Wend
            inByte = MSComm1.Input
            
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                str1 = 0 & Hex(inByte(i))
                Text14 = str1   ‘最后text14里边显示的是"00"
            Else
                str1 = Hex(inByte(i))
                Text15 = str1   '最后text15里边显示的是"92"
            End If
                strData = strData & str1
                Text13 = strData
    '在text13中显示的就是下位机给我发送的正确数据"10030211073511234505050604000800260027030110030211073200000000007492"       
            Next
                MSComm1.RThreshold = 1
        End Select
            Text16 = strData   ’但是到了这个地方就没有了,里边是空的了,为啥啊?
            Call subSaveString
            
    End Sub
      

  9.   

    把Text16 = strData  放到select语句里面,可能被MSComm1.CommEvent 的其他事件覆盖了
      

  10.   

    '
    '
    '
     Next 
        End Select 
           Text16 = strData  ’但是到了这个地方就没有了,里边是空的了,为啥啊? 
            Call subSaveString 
           MSComm1.RThreshold = 1         
    End Sub
      

  11.   

    我这样以后还是不行,就是把处理数据的代码放在MSComm1_OnComm事件里边可以了。
    Next 
        End Select 
          Text16 = strData  ’但是到了这个地方就没有了,里边是空的了,为啥啊? 
            Call subSaveString 
          MSComm1.RThreshold = 1        
    .........  
    .........
    ........
    End Sub