3

有没有办法在 c# 中编写一个串口重定向器?我有一个编码为使用端口 1 (com1:) 的应用程序,但是,我在手持设备 (Intermec CN50) 上的端口始终为 3。我无权修改移动软件,但是我想重定向任何数据输出到 1 将其复制到 3 并且任何传入的数据将其从 3 复制到 1,因此应用程序不知道其中的区别。

我知道这是一个棘手的问题,但我相信你们中的一个人有一个答案。

我当然不会。

谢谢克里斯

4

1 回答 1

3

不,没有。您有几种选择,具体取决于设备和您的确切需求。

第一个也是最简单的,是重定向驱动程序。 如果您的设备尚未定义 COM1 设备,您可以修改注册表HKLM\drivers\builtin并将特定端口的索引从 更改31。这将导致 device.exe 将端口公开为 COM1 而不是 COM3。但是,根据我的经验,这不太可能起作用,因为大多数串行端口都设置为让操作系统自动分配索引,这意味着 COM1 和 COM2 已经在使用中。但是,您仍然可以解决此问题。您只需为设备的 3 或以下的每个实例显式分配一个索引。将索引 1 移动到 3 并将索引 3 移动到 1,您可以有效地交换端口。

以下是一些示例 - 有一些示例,因为这取决于 OEM 设置驱动程序初始化的方式。这是一个没有明确命名端口的驱动程序示例(在本例中为 I2C,但它的工作方式相同):

没有端口的驱动程序

注意有一个Prefix和一个Index。该驱动程序将枚举为“I2C0:”。如果您将Index值更改为其他值,例如“2”,那么它将枚举为“I2C2:”。

在某些情况下,驱动程序可以提供特定的端口名称,例如:

在此处输入图像描述

请注意,该Port值与Prefixplus匹配Index。不知道如果您手动将它们设置为不同会发生什么,所以不要这样做。如果您想将此移至 COM3,您需要更改Index为 3 和PortCOM3,但您必须确保注册表中没有任何其他内容已设置为使用这些值。您不希望两个驱动程序实例尝试在同一个索引处进行枚举。如果你这样做,我认为行为是第二​​个只是增加,但最好明确地将值设置为唯一的,这样你就知道发生了什么。

如果这不能满足您的需求,您必须编写一个实际的设备驱动程序来进行端口移动/聚合。它的工作原理很像 Windows Mobile 下现有的 GPS 中间驱动程序 (GPSID),并允许您将串行数据重定向到您想要的任何端口。但是,这必须用 C 编写,因为托管代码(在 CF 中)无法导出本机符号,因此无法让 device.exe 加载 C# 程序集。

于 2012-05-14T16:54:51.503 回答