c# - C# 中串行端口的多端口异步 I/O

标签 c# .net serial-port

我正在尝试为序列号 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 的速度测试了我的例程。在这样的速度下,不使用代表是更好的选择。

这里有一些知情人士的提示

Kim Hamilton

关于c# - C# 中串行端口的多端口异步 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675143/

相关文章:

c# - 正则表达式.替换 : replace only first one found

c# - 为什么将我们的 .NET/SQL Server 网站移动到新主机会导致超过连接池大小?

python - 如何让 python 脚本监听来自另一个脚本的输入

c# - 为什么当调制解调器处于数据模式时不会触发 System.IO.Ports.SerialPort.DataReceived 事件?

c# - 从 TFS 单元测试覆盖范围中排除文件夹

c# - 如何设置扬声器声音增强设置

c# - 如何在 ASP.NET Core 中获取客户端 IP 地址?

c# - .NET 位图类无法打开 LinkedIn 个人资料图片 - 关于如何打开有什么建议吗?

.net - OracleBulkCopy 与 SQL*Loader 性能对比

serial-port - 是否可以像fiddler或wireshark一样监听串口通信?