c#serialport控件的DataReceived事件
c#serialport控件的DataReceived事件,触发之后先sleep100ms,将从串口读到的数据添加到datatable;同时,另一个线程循环遍历datat...
c#serialport控件的DataReceived事件,触发之后先sleep100ms,将从串口读到的数据添加到datatable;同时,另一个线程循环遍历datatable做数据比对,会不会有什么影响,数据会不会出问题?
展开
1个回答
推荐于2016-02-15
展开全部
不要做sleep。串口通讯是有时序的,sleep会增加延时,会影响数据接收的。
异步线程操作同一个datatable,需要考虑同步加锁。否则,数据会出错。
为什么不在UI线程里处理DataReceived和数据?
追问
这里sleep是为了完整接收数据,避免只接收部分
UI线程是主线程,而使用serialport控件时系统就会创建一个辅助线程,不明白你说的在UI线程里做是什么意思。因为我原先DataReceived逻辑代码太多,来不及处理,所以现在先在DataReceived建一个队列,另外在开一个线程来处理
追答
流模式传输是无法保证接收的完整性的,你必须在自己的代码里拼接数据和判断数据的完整性。
Sleep虽然暂时可用,但并不是正确的做法。(Sleep(100)并不保证准确的100ms,有可能结果是1000ms呀)。
如果处理复杂,比较耗时,那就用辅助线程吧。但是线程之间的数据传递,采用队列+AutoResetEvent( 或 ManualResetEvent)比较好,这样避免辅助线程占用太多CPU。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询