我正在尝试为序列号 I/O 编写测试应用程序( RS-232 ) 在 C# 中有多个单元,我遇到了一个问题,因为我缺乏线程经验,所以我正在征求对一种最著名方法的反馈。
我有一个 COM 端口 COM1-16 池,每个端口都可以随时读/写,我需要能够同时管理它们。这是线程池的情况吗?关于构建此小程序的一些指导是什么?
编辑: 回顾之后,我想知道我是否真的需要在这里执行异步线程,我可以只维护每个 COM 端口的状态并分别为每个 COM 端口执行流逻辑(即状态机)。
最佳答案
围绕串行端口的许多困难都集中在一个假设上。假设串行端口以方便的 block 形式接收数据,这是预期的。
这是一个例子。我知道我的 GPS 接收器发送线路(以 CRLF 结尾)。这是 NMEA 句子之一的示例:
$GPGSV,3,1,11,10,75,053,29,29,52,311,32,24,50,298,30,02,39,073,30*77
但是,串行端口 DataReceived 事件处理程序可能(通常在我的 PC 上)会针对该数据 block 触发多次。
事件触发 - 数据
1 $
2 GPGSV,3,1,11,10
3 ,75,053,29,29,52,311,32,24,50,298,30,02,39,073,30*77
我没有解决这个问题,而是创建了一些例程,在事件触发时接收数据,并将其排队。当我需要数据时,我会调用一些其他例程,这些例程将数据按我想要的 block 大小重新组合在一起。因此,第一次和第二次使用我的示例调用 read line(my readline) 我得到一个空答案。 第三次我找回了整个 NMEA 句子。
坏消息是我不会 C#。代码在这里 SerialPort
根据端口代理的速度,可能不是一个好的选择。我使用委托(delegate)和不使用委托(delegate)以接近 1Mbps 的速度测试了我的例程。在这样的速度下,不使用代表是更好的选择。
这里有一些知情人士的提示
关于c# - C# 中串行端口的多端口异步 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675143/