如何在C#中异步监听多个串口?

5
我有一个应用程序,它监听USB串口转换器上的硬件。我的应用程序应该同时监控多个串口。
我循环遍历需要监听的串口,并为每个串口创建一个线程。在线程中,我有我的数据处理例程。
当我分配一个端口时,它运行得非常顺利。当我监听另一个端口时,它也可以工作。然而,当我打开两个端口时,第二个端口总是在调用serialPort.Open()时抛出UnauthorizedAccessException异常。无论我以什么顺序打开端口,第二个都会失败。
我使用serialPort.ReadLine()在while循环中监听端口。
.NET能够同时打开多个端口吗?我可以同时监听两个端口吗?还是应该使用另一种(线程安全的?)方法来访问我的串口事件?

1
我已经年老了,可能比你出生之前就开始写串口代码了。所以别误会,这个“在while循环中使用serialPort.ReadLine()”告诉我你还没完全掌握DataReceived事件处理程序。当我再次开始编程时,我用的是MS Visual Basic,并且我编写的第一个软件之一就是一个串口处理程序。如果你想看它,请让我知道,在另一个论坛上有它的信息。我希望有时间重新编写它,但我相信它可以与多个串口一起工作。我测试过它的速度高达900Kbps。 - dbasnett
1
你说得对,我没有使用事件,而且我也知道 :-) 我一有机会就会重构这段代码 :-) - Kamiel Wanrooij
1个回答

5
异常信息是有一个非常具体的意义,它告诉你已经有人打开了这个端口。那么是谁呢?在打开第二个端口时,一定要三次检查确保使用的是不同的端口名称。
下一步是将USB模拟器带到停车场,并用车轮碾压多次,使其无法再让程序员疯狂。然后从另一个制造商那里获取一个使用不同设备驱动程序供应商的模拟器。

1
停车场的评论很有帮助 :-) 结果发现我的闭包导致同一端口再次被打开。我真是太蠢了! :( 谢谢! - Kamiel Wanrooij
2
USB设备损坏提示很有用。所有的USB串口设备绝对不是同质化的。 - Andy
这就是解决方案。如果可以的话,始终使用实际设备进行测试。我的做法是运行两个Arduino,并分别进行识别。这有助于我准备代码,最后我可以简单地移动到实际设备并修复设置。 - Dr.Viper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接