解决方案 »
- ObjectContext.CreateObjectSet<TEntity>怎么用
- 在这里对一个对象复制应该怎么写哇?
- 请问下 ReportViewer控件和CrystalReportViewer控件 有什么不同啊 ??
- 请教js的正确写法,怎么样能找到母版页中的form1
- 斑竹进
- C# 字符串问题
- 怎么在msdn中看某个类都有哪些类继承了他?比如Exception类,我想知道具体都有哪些异常继承了Exception,这个异常继承树的结构是怎么样的,要怎么看呢?
- 求教,图像显示问题
- 程序不能启动,总是报以下异常,System.ArithmeticException!高人请看
- GDI+绘图绘出的文字可以加边框颜色吗?
- 请教Windows Phone 7 项目方向
- C# splitContainer 判断窗口是否打开?
不用DataReceived事件更好写,直接在一个线程里循环先读取三个字节-再读取第三个字节所指的长度数的字节就可以了.
在事件的处理程序中这样写逻辑:
将收到的字节放入你定义的全局的待解析队列中去,可以用List、LinkedList或者Queue等来存储。
另起一个线程,专门来解析数据,逻辑大致如下:
这是一个死循环。
1,Sleep(10),这样可以保证程序占用CPU资源较少。先判断当前是否正在解析一包数据(已经读到了开始标志位0XFF)。
如果读到了开始标志位,则根据命令码判断是否命令码符合通信协议规定,如果是非系统可识别的命令码,则丢弃这两个字节。继续判断是否正在解析一包数据。如果开始标志位和命令码都读到了,则判断接下来的一个字节:数据长度,然后根据数据长度判断当前队列中的所有数据总和是否是否等于或大于数据长度,如果不满足这个条件,则继续循环1.
如果已经满足这个条件,则将取验证码(根据数据长度来计算验证码在队列中所处的位置。)然后对这包数据进行验证,如果验证成功,则从队列中将这包数据卸下(存储到一个Byte数组中,然后从队列中删除这包数据)。
这时你就已经得到了“干净”的这包数据了。然后对这包数据进行解析。
解析过程中如果出错,则抛出异常,继续执行此循环。
如果解析正常,则保存你要的数据后,然后继续执行此循环,解析下一包数据。
这个协议很简单啊,而且也很好处理,每接收一个字节的数据就触发DataReceived事件。