6

我有一个通过串行端口连接到设备的实用程序。为了测试这个应用程序,我正在为该设备编写一个模拟器。

这两个应用程序旨在在同一台 Windows 7 机器上运行。

我正在用 C# 编写模拟器。我使用 com0com 创建了一对虚拟端口(在本例中 - CNCA8 和 CNCB8,因为我已经有几个现有的端口对)。

我正在尝试在模拟器中打开 CNCB8(应用程序尚未运行),但出现异常:

System.dll 中出现“System.ArgumentException”类型的未处理异常

附加信息:给定的端口名称不以 COM/com 开头或不解析为有效的串行端口。

示例代码:

        SerialPort port = new SerialPort("CNCB8", 9600, Parity.None, 8, StopBits.One);
        port.Handshake = Handshake.None;            
        port.Open();

这个问题不相关,因为它是一个未使用的虚拟端口(如果重要,IsOpen 返回 false): C# SerialPort#Open() 方法由于端口名称而引发 ArgumentException?

编辑:我还确保端口名称出现在 SerialPort.GetPortNames() 中,并且它出现在“com0com 串行端口仿真器”下的 WIndows 设备管理器中。我还尝试使用 CNCA 而不是 B(具有几个不同的现有虚拟端口),尝试删除“HandShake”行并尝试将波特率更改为 115200,以防万一(尽管最终我需要 9600)。

4

2 回答 2

5

Com0com 允许您编辑端口名称。如果您将您的配对重命名为 COM10 和 COM11,这种情况还会发生吗?

另外,这些端口真的存在吗?在 Windows Server 2008 R2 上,我们不得不发出 Com0com README 文件中提到的 bcdedit 命令,因为操作系统不信任设备驱动程序。

于 2013-08-14T12:37:29.077 回答
2

从 .NET Framework 4.7.2 开始,SerialPort该类创建一个SerialStream实例,该实例在构造函数中具有以下代码:

if (portName == null || !portName.StartsWith("COM", StringComparison.OrdinalIgnoreCase))
    throw new ArgumentException(...)

伤心,真的......因为调用静态方法SerialPort.GetPortNames()愉快地返回字符串数组{"COM1", "CNCA0", "CNCB0"}

我的解决方案是在 Ian Millers 中重命名虚拟 COM 端口的答案。为此,我打电话给

setupc.exe change CNCA0 Portame=COM8
setupc.exe change CNCB0 Portame=COM9

com0com 安装后。

于 2019-10-18T14:48:05.397 回答