本帖最后由 bcrun 于 2012-09-19 11:04:16 编辑

解决方案 »

  1.   

    你可以这么试想一下,如果每一次产生事件时你最多只能收到一个字节的数据时,你该如何处理这样的问题?如果从一个字节变为两个字节呢?或者再换为三个字节呢?到现在的不固定字节也就很容易处理了。其实这个问题是必须要面对的,在 Windows 程序开发当中的这种优越环境已经是很不错了,试想一下单片机程序,每一次串口中断的触发只能收到一个字节,而且变量都不敢多定义,通常的单片机整个内存才128个字节,串口通讯只是整个单片机系统的一个小部分程序,还要浪费内存到别的地方用,而且串口中断的处理过程不能太多,一个是怕代码太多单片机存不了(比如2K内存的那种),再一个就是处理过程太多会超出中断发生时间,这样多出来的程序就不会被执行。相对来说,单片机程序都能处理复杂的指令集和较大的数据流,PC程序处理起来应该简单方便很多。对于这方面你可以考虑一下可以如何做到。给你点提示:
    1、用公共变量
    2、分步处理
    3、也可以按单片机的思路处理,比如模拟环境
    ReadBytes = MSComm1.Input
    ReadCount = UBound(ReadBytes)
    For i = 0 To ReadCount
        ReadByte = ReadBytes(i)
        '...
        ' 这样就每次处理一个字节了
        '...
    Next i
      

  2.   


    Dim Bytedata() As ByteSelect Case Comm.CommEvent
           Case comEvReceive
                On Error Resume Next  Bytedata = Comm.Input
    end select
      

  3.   

    你可以参考这一个帖子我讲的内容
    http://topic.csdn.net/u/20110404/10/32a8336b-be14-4135-ba3c-9e604a8a2b4e.html
      

  4.   

    恩,公共变量是否类似我现在用的文本框,不关每次input中的数据有多少我都先放到公共的文本框中,直到判断文本框中的数据满足一定条件(即完整数据包条件,我代码中用的text4)在做处理。
    我疑问的是
    1.我自己获取串口返回的input值,有时候完整数据包有时又是残缺的
    2.使用网上的各种串口调试工具却每次都是完整的数据包 
    这是为什么呢?前提是我每次向设备发送一次“410”命令的请求,它就应该会返回一个完整的数据包
    大神能不能给解释下,比如说我获得的一个段数据内容没有缺失前面的包头相关标识和一部分内容,请问这一部分内容怎么丢失掉到?
      

  5.   


    数据不完整往往是因为从 Input 缓存中获取数据太早。串口是极低速的通讯端口,与 PC 代码运行差几个数量级。如果你知道应该返回多少个字节,可以检查 InBufferCount:Do Until MSComm1.InBufferCount = 32
      DoEvents
    Loop
    InputSignal = MSComm1.Input如果接收到字节数是常数,可以直接设置 RThreshold 属性为此常数。就不需要循环检查。如果你不知道返回多少字节,可以在 InputSignal = MSComm1.Input 前加延时,通过实验确定能够收到最长完整数据所需的时间。
      

  6.   

    你应该看看我给你的那个连接的帖子,里面有一段单片机的串口通讯处理过程,也有上位机的处理过程(包括VB的过程),你试着跟着程序思路逐行看一遍,应该会理解程序思路。按照这个思路,无论是资源小的单片机还是效率高的C语言,甚至是用异步通讯的VB控件,都可以很高效稳定的进行通讯。这些是经过多年的实践验证过的经验,不会有什么数据丢失问题的。