需要从4个串口读数据,两台电子秤,两个条码枪,电子称是不停的在发字符串,里面含有一段采集来的重量值,重量数字的前后都有字母。条码枪是采集到条码信号就发送条码字符串。我用了4个TIMER控件来不停的扫描INPUT区,等到InBufferCount大于12就读出INPUT区的内容,用的是IF来判断InBufferCount的情况,条件不满足就跳出SUB过程。读出的电子称数据用MID语句挖出其中的重量值后将其赋给LABEL显示出来。但实际中出现的情况MID挖出的值有时候含有字母,导致重量值显示不全,条码值有时候也显示不全。请问各位高手献出高招~~~谢谢先~~~
请先告诉我我这思路有问题吗?
菜鸟在线等~~~~~~谢谢

解决方案 »

  1.   

    楼上的,我现在是等缓冲区数据的长度大于12就读数据,用MID函数挖出我要的数据。但由于缓冲取的数据不只一次发送的数据,造成MID函数挖出数据不对。
      

  2.   

    事件驱动不行吗?我觉得用TIME扫描的方式不好,如果波特率高,12个字符很快的,TIME不一定来到及。
      

  3.   

    是MSComm1_OnComm()事件,RThreshold设为12,收到12个字符后MSComm1_OnComm()发生,如果是comEvReceive,即可处理数据。
    我给你一些地址,csdn的,你看看是否对你有帮助。
    http://community.csdn.net/Expert/topic/5611/5611214.xml?temp=.6590998
    http://community.csdn.net/Expert/topic/5655/5655991.xml?temp=.1419947
    http://community.csdn.net/Expert/topic/5682/5682611.xml?temp=8.358401E-02
    还有很多,你可以看一下。
      

  4.   

    其实,主要是接收过来的数据你怎么拼成一个合格的数据,这个数据中含有你需要的数据,还有要注意你每次收到的长度都是12个,看你要用什么方式显示,显示方式很重要,看看是ASCII码,还是二进制,显示对了很容易就出来了,显示选的不对,累死你
      

  5.   

    从你贴子叙述,看不出你机器有几个串口?从4个串口读数据,这4串口是RS232口并联还是用RS485口分地址区别?
    其次两台电子秤及两个条码枪与你接收代码间的通信协议.楼上有人提到使用事件驱动,我同意此观点.
    使用MSCOMM控件的ONCOMM事件进行接收,接收时要依据通信协议来处理数据.不知两台电子秤及两个条码枪发送的数据字节长度都是12字节,如是的话,则应设置MSCOMM控件属性
    RThreshold = 12
    接收ASCII码或二进制数据,MSCOMM控件属性InputMode也不一样.数据处理方式也有差异.
      

  6.   

    既然用了4个串口那么你应使用4个MSCOMM控件,分别使用MSCOMM的ONCOMM事件来进行接收数据。代码中不要使用MSGBOX语句,那会中断程序。4个MSCOMM的接收代码需分别按各自的通信协议作好接收算法。祝好运。
      

  7.   

    我自己做过的一个串口数据接收
    Private Sub MSComm1_OnComm()
       On Error Resume Next
       Dim bytData As Variant
       Dim ErrorNum As Integer
       DoEvents
       If StartScan = True Then
        With MSComm1
          If .InBufferCount >= 21 Then
           bytData = .Input
           .InBufferCount = 0
           DataStr = bytData
           ErrorNum = InStr(1, DataStr, "FFFFFF")
            If ErrorNum = 0 Then
              ScanFinish = False
               Scanning = True
              TempStr = Trim(ProcessStr(DataStr))
              ComCount = ComCount + 1
              If ComCount >= 6000 Then
                StartScan = False
                ScanFinish = True
                ComCount = 0
              End If
              m_Data = Mid(TempStr, 4, 8)
              n_Data = Mid(TempStr, 13, 8)
              If ComCount >= 2 Then
                '收集数据 
              End If
            Else
              If Scanning = True Then ScanedCount = ScanedCount + 1
              If ScanedCount > 20 Then
                ScanFinish = True
              End If
            End If
          End If
        End With
       Else
         With MSComm1
         If .InBufferCount >= 21 Then
           bytData = .Input
           .InBufferCount = 0
           DataStr = bytData 'Replace(Trim(bytData), Chr(13), "S", 1)
           ErrorNum = InStr(1, DataStr, "FFFFFF")
            If ErrorNum = 0 Then
              ComCount = ComCount + 1
              If ComCount > 6000 Then ComCount = 0
              TempStr = Trim(ProcessStr(DataStr))
              m_Data = Mid(TempStr, 4, 8)
              n_Data = Mid(TempStr, 13, 8)
            End If
          End If
         End With
       End If
    End Sub