C#打开虚拟串口会抛出ArgumentException

时间:2013-08-14 11:44:36

标签: c# windows serial-port virtual-serial-port

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

这两个应用程序都可以在同一台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() method throws ArgumentException because of port name?

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

2 个答案:

答案 0 :(得分:3)

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

此外,端口真的还活着吗?在Windows Server 2008 R2上,我们必须发出com0com README文件提到的bcdedit命令,因为操作系统不信任设备驱动程序。

答案 1 :(得分:1)

从.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之后。