首页 新闻 搜索 专区 学院

关于C# 多串口同时通信的问题

0
[已解决问题] 解决于 2014-07-08 08:05

以前是用for循环实现的多个串口发送数据,但是整个软件运行时间太长,领导让优化时间,我能想到的就是让多个串口并行操作数据,但是我对多线程不是很了解,试过拖多个串口控件实现,由于串口过多,效果不是很理想,所以想请假各位大神如何用多线程实现多串口同时通信?最好能有一个demo给我参考下,谢谢

Dranched的主页 Dranched | 初学一级 | 园豆:23
提问于:2014-07-04 17:07
< >
分享
最佳答案
0

http://msdn.microsoft.com/zh-cn/library/system.threading.tasks.parallel.foreach(v=vs.110).aspx

 

当然你的机器得有多个核心,单核心上不会有明显的优势。

要提高性能,通常会使用 IOCP 的方式。

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2014-07-04 17:16

多线程处理串口的倒是没有,DEMO代码倒是有,你搜下 ThreadPool.QueueUserWorkItem 这个东西吧

var doEvents = new ManualResetEvent[threadCount];
                for (var i = 0; i < threadCount; i++)
                {
                    doEvents[i] = new ManualResetEvent(false);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(DealData), new object[] { i, doEvents[i] });
                }
                WaitHandle.WaitAll(doEvents);

public void DealData(object eventParams)         {           

var threadId = (int)(((object[])eventParams)[0]);      //当前线程ID            

var doEvent = (ManualResetEvent)(((object[])eventParams)[1]);            

var perThreadCount = dataTable.Rows.Count / threadCount;       //平均每个线程处理数据

            for (int i = 0; i < dataTable.Rows.Count; i++)             {               

      if (i < (threadId) * perThreadCount)           continue;

                if ((i >= (threadId + 1) * perThreadCount) && threadId != (threadCount - 1))                break;

                ImportData(dataTable.Rows[i]);            

}            

doEvent.Set();       

}

 

Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-07-04 17:57
其他回答(2)
0

开多线程基本上是可以实现并行发送的,因为窗口速率相对CPU速度来说非常低

你直接多开线程操作串口就能有很大提升

吴瑞祥 | 园豆:29369 (高人七级) | 2014-07-04 18:25
0

如果你的for循环能满足你们对多串口特定速率的连续不中断的发送和接收,则换多线程不会给你带来额外的通讯效率。

LiuKaiFa | 园豆:1491 (小虾三级) | 2014-07-06 16:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册