最近买了个HUTONE的PCI扩的双串口卡(NJP)。VB做个界面,放置两个 MSCOMM控件, 连接两台设备。现在发现每运行一段时间后,就不能正常收发数据,只能重新启动PC或者注销重登陆后,才能恢复正常。不知道有没有大侠用过类似的串口卡,或者遇到类似的问题,是如何解决的?? 希望大侠不吝赐教!!!
 

解决方案 »

  1.   

    将MSCOMM控件放独立窗体,由主窗体来定时关闭和打开窗体.
      

  2.   

    只要 Mscomm1与Mscomm2都能 Open 成功 那就不是你双口卡的问题了,因为 ComPort并没问题.应该是你的代码处理问题.
      

  3.   

    多谢两位高人的指引。 有些信息我再补充一下: PC被动接收数据。所以用轮询是不是不太合适?询问过他们的技术支持, 他们说我用的NJP那款,板子上没有复位芯片。是不是没有复位芯片造成的呢?哎,真愁人,无奈了~~~~~~~~~~~
      

  4.   

    你接收是使用 MSComm1_OnComm 事件吗?
      

  5.   

    既然你的PC是被动接受数据,那么你就最好使用OnComm事件方式来处理,楼主参考一下这个:
    http://download.csdn.net/source/1262066这是一个串口调试器的源代码,你可以借鉴,只需要把接收到的数据分段即可。
      

  6.   

    感谢楼上各位@cmb666 ,我程序里用的是MSComm1_OnComm  和MSComm2_OnComm事件。 
      

  7.   

    你把 MSComm1_OnComm  的代码贴出来看看 我经常在接4台-8台的电子秤 也不觉得卡....
      

  8.   

    Private Sub MSComm1_OnComm()
    If SmartProperty.SmartItems.Item("UpLimit").Value = "" Then Exit SubDim sTemp As String
    Dim sReceive As String
    Dim iPos As Integer
    Dim strPart1_Sign As String
    Dim strPart2_Wgt  As String
    Dim strPart3_Unit  As StringDim ddd As Long
    On Error GoTo errHandler
        sReceive = ""
        MSComm1.InputLen = 22    Select Case MSComm1.CommEvent
          Case comEvReceive                                        '接收到22个数据
           If InStr(1, sTemp, "rr") = 0 Then   'Or InStr(sTemp, ".") > InStr(sTemp, "N") Then    
                sTemp = MSComm1.Input
                If VBA.Mid(sTemp, 1, 1) = " " And InStr(1, sTemp, "g") <> 0 Then GoTo errHandler
                strPart1_Sign = VBA.Trim(VBA.Mid(sTemp, 7, 1))
                strPart2_Wgt = VBA.Trim(VBA.Mid(sTemp, 9, 8))
                strPart3_Unit = VBA.Trim(VBA.Mid(sTemp, 18, 3))            'sReceive = strPart1_Sign & strPart2_Wgt & strPart3_Unit            If intWeighingStep = 1 Then
                  txtTare.Text = strPart2_Wgt 'sReceive
                  dblTare = txtTare.Text              SmartTabStrip_Click SmartTabStrip.SmartItems.Item("皮重称量")
                  SmartTabStrip.SmartItems.Item("皮重称量").Visibility = viVisible
                  SmartTabStrip.SmartItems.Item("皮重称量").Selected = True
                  intWeighingStep = 2
                  If bAudio = True Then
                    ddd = SmartRead_Speak("当前皮重是" & txtTare.Text & "千克 请放入净重,并在稳定后按打印键!", 11, 0, -1, -1, 1, "http://www.smartread.net/cn/index.html")
                  End If
                ElseIf intWeighingStep = 2 Then              txtNET.Text = strPart2_Wgt 'sReceive
                  txtNET.Text = Format(txtNET.Text, "0.000")
                  dblNet = txtNET.Text
                  SmartTabStrip_Click SmartTabStrip.SmartItems.Item("净重称量")
                  SmartTabStrip.SmartItems.Item("净重称量").Visibility = viVisible
                  SmartTabStrip.SmartItems.Item("净重称量").Selected = True
                  intWeighingStep = 3
                  txtNetTare.Text = Format(Val(txtNET.Text) + Val(txtTare.Text), "0.000")
                  If bAudio = True Then
                    ddd = SmartRead_Speak("当前净重是" & txtNET.Text & "千克 请将装完物质的容器放入复核秤,并在稳定后按打印键!", 11, 0, -1, -1, 1, "http://www.smartread.net/cn/index.html")
                  End If
                End If
              End If      Case comRxParity                                       '接收错误          MsgBox "提示: 通 信 格 式 错  ! "
        End Select    MSComm1.InBufferCount = 0                                '接收缓冲区清零
        Exit SuberrHandler:
        Me.MSComm1.PortOpen = False
        Me.MSComm1.InBufferCount = 0
        Me.MSComm1.PortOpen = TrueEnd Sub
      

  9.   

    sTemp = MSComm1.Input '这行拿到上面 If InStr(1, sTemp, "rr") = 0 Then  'Or InStr(sTemp, ".") > InStr(sTemp, "N") then    
     
      

  10.   

    sTemp = MSComm1.Input '这行拿到上面 
    没有先取得 sTemp的值你下面这行的sTemp要从那里来?
    If InStr(1, sTemp, "rr") = 0 Then  'Or InStr(sTemp, ".") > InStr(sTemp, "N") then    
      

  11.   

    多谢cbm666及各位热心的朋友