本帖最后由 ling3wei 于 2011-04-06 12:11:36 编辑

解决方案 »

  1.   

    哪个SB定义的,长度不固定又没结束符,搞个P
      

  2.   

    有这个字节就行了啊,先读取三个字节,然后看第三个字节长度是多少,再读取这么多长度的字节.
    不用DataReceived事件更好写,直接在一个线程里循环先读取三个字节-再读取第三个字节所指的长度数的字节就可以了.
      

  3.   

    这个协议很简单啊,而且也很好处理,每接收一个字节的数据就出发DataReceived事件。
    在事件的处理程序中这样写逻辑:
    将收到的字节放入你定义的全局的待解析队列中去,可以用List、LinkedList或者Queue等来存储。
    另起一个线程,专门来解析数据,逻辑大致如下:
    这是一个死循环。
    1,Sleep(10),这样可以保证程序占用CPU资源较少。先判断当前是否正在解析一包数据(已经读到了开始标志位0XFF)。
    如果读到了开始标志位,则根据命令码判断是否命令码符合通信协议规定,如果是非系统可识别的命令码,则丢弃这两个字节。继续判断是否正在解析一包数据。如果开始标志位和命令码都读到了,则判断接下来的一个字节:数据长度,然后根据数据长度判断当前队列中的所有数据总和是否是否等于或大于数据长度,如果不满足这个条件,则继续循环1.
    如果已经满足这个条件,则将取验证码(根据数据长度来计算验证码在队列中所处的位置。)然后对这包数据进行验证,如果验证成功,则从队列中将这包数据卸下(存储到一个Byte数组中,然后从队列中删除这包数据)。
    这时你就已经得到了“干净”的这包数据了。然后对这包数据进行解析。
    解析过程中如果出错,则抛出异常,继续执行此循环。
    如果解析正常,则保存你要的数据后,然后继续执行此循环,解析下一包数据。
      

  4.   

    上面有个错别字,不好意思:
    这个协议很简单啊,而且也很好处理,每接收一个字节的数据就触发DataReceived事件。