Chinaunix首页 | 论坛 | 博客
  • 博客访问: 499267
  • 博文数量: 68
  • 博客积分: 2492
  • 博客等级: 大尉
  • 技术积分: 866
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-02 16:30
个人简介

承接移动应用(iOS、Android、WP),桌面应用(VC++、C#、VB、Qt)和嵌入式软件(单片机、ARM)开发。欢迎接洽。QQ:2335301794,E-mail:rabbitom@gmail.com。

文章分类

全部博文(68)

文章存档

2016年(1)

2015年(2)

2014年(4)

2013年(6)

2012年(1)

2011年(8)

2010年(16)

2009年(8)

2008年(10)

2007年(12)

我的朋友

分类: C#/.net

2015-04-21 11:58:40

今天用C#(VS2010,.Net Framework 3.5)写一个串口助手(使用类),异步接收,底层收到数据后触发DataReceived事件,在事件处理程序中读数据并以十六进制形式打印出来。测试时发现只要接收到0x1A,程序就会卡死,窗口上的按钮都没有反应(0x1A仍然正常打印了出来)。
此问题的原因是:.Net串口通信中将0x1A当作EOF处理,接收到EOF会触发两次数据到达事件,如果在第一次事件处理时用Read函数将数据读空,那么下一次调用Read时程序就会block,直到有新的数据到达。
解决方法:0x1A触发的两次事件,一次是EOF,一次是普通数据,在事件处理程序中判断事件类型,如果是EOF事件则不进行读操作。代码如下:
点击(此处)折叠或打开
  1. private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
  2.     if (e.EventType == SerialData.Eof)
  3.         return;
  4.     this.Invoke(serialRecvDelegate);
  5. }
项目源代码请移步Git@OSC:

参考:
MSDN:
Stack Overflow:http://stackoverflow.com/questions/12483711/serialdata-eof-circumstances
阅读(6624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~