c#serialport控件的DataReceived事件

c#serialport控件的DataReceived事件,触发之后先sleep100ms,将从串口读到的数据添加到datatable;同时,另一个线程循环遍历datat... c#serialport控件的DataReceived事件,触发之后先sleep100ms,将从串口读到的数据添加到datatable;同时,另一个线程循环遍历datatable做数据比对,会不会有什么影响,数据会不会出问题? 展开
 我来答
匿名用户
推荐于2016-02-15
展开全部
  1. 不要做sleep。串口通讯是有时序的,sleep会增加延时,会影响数据接收的。

  2. 异步线程操作同一个datatable,需要考虑同步加锁。否则,数据会出错。

为什么不在UI线程里处理DataReceived和数据?

追问
这里sleep是为了完整接收数据,避免只接收部分
UI线程是主线程,而使用serialport控件时系统就会创建一个辅助线程,不明白你说的在UI线程里做是什么意思。因为我原先DataReceived逻辑代码太多,来不及处理,所以现在先在DataReceived建一个队列,另外在开一个线程来处理
追答
流模式传输是无法保证接收的完整性的,你必须在自己的代码里拼接数据和判断数据的完整性。
Sleep虽然暂时可用,但并不是正确的做法。(Sleep(100)并不保证准确的100ms,有可能结果是1000ms呀)。
如果处理复杂,比较耗时,那就用辅助线程吧。但是线程之间的数据传递,采用队列+AutoResetEvent( 或 ManualResetEvent)比较好,这样避免辅助线程占用太多CPU。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式