c# - 在真实和虚拟串行端口之间创建一对

标签 c# serial-port automated-tests virtual-serial-port com0com

我正在开发一个可以自动测试遗留应用程序的实用程序。遗留应用程序在 Windows 2000 上运行,并使用 3 个通过串行 (COM) 端口连接的设备。

我可以访问应用程序的源代码,但无法进行任何更改。但是,源代码允许我验证设备 COM 端口名称是否作为 COM1(打印机)、COM2(钞票阅读器)和 COM3(条形码/OMR 阅读器)硬编码到应用程序中。我还可以看到发送到每个设备的字节,以及应用程序如何处理返回。

目前,我想编写有关钞票阅读器的测试。我从这里的各种问题(例如 Faking an RS232 Serial Port)中读到我可以使用 com0com 来伪造串行端口。我希望有一种方法可以代表应用程序接收的真实 COM 端口设备发送字节。

安装实用程序后,我将一对配置为“COM2”到“COM6”。 COM2 标签显示为红色,当我按 OK 时,我收到以下消息:

The port name COM2 is already used for other device \Device\Serial1

然后我可以按“取消”、“重试”或“继续”。

按下继续我得到:

The port name COM2 is already logged as "in use" in the COM port database

我再次按下“继续”。

我用 C# 编写了一个小应用程序来测试 COM2 和 COM6 端口配对。当我向 COM2 发送有效字节时,我得到了预期的 11 个字节(这完全反射(reflect)了遗留应用程序中的场景)。 COM6 上没有收到任何信息。当我向 COM6 发送相同的字节时,我没有收到来自 COM2 或 COM6 的响应。

我试过重启机器,再次设置配对,尝试不同的 COM 端口(COM1 到 COM6,COM3 到 COM6),但在这些虚拟端口上从未得到响应(COM1 和 COM3 也是红色的,给我通过 com0com 出现相同的错误)。

测试C#应用如下:

using System;
using System.IO.Ports;

public class Com
{
    private static byte[] s_pDataSent = new byte[32];
    private static byte[] s_pDataRead = new byte[32];

    private static void port_OnReceivedDatazz(
        object sender,
        SerialDataReceivedEventArgs e)
    {
        var sp = (SerialPort)sender;
        var buffer = new byte[sp.BytesToRead];
        Console.WriteLine("DATA RECEIVED ON " + sp.PortName);
        sp.Read(buffer, 0, buffer.Length);
        foreach(var b in buffer)
        {
            Console.Write(b.ToString() + " ");
        }
        Console.WriteLine();
    }

    public void Do(string portName, string virtualPort)
    {
        var port = new SerialPort(
            portName,
            9600,
            Parity.Even,
            7,
            StopBits.One);
        port.RtsEnable = false;
        port.DtrEnable = false;
        port.DataReceived += port_OnReceivedDatazz;
        port.Open();

        if (!port.IsOpen)
        {
            Console.WriteLine("Port is closed");
        }

        var vport = new SerialPort(
            virtualPort,
            9600,
            Parity.Even,
            7,
            StopBits.One);
                vport.RtsEnable = false;
                vport.DtrEnable = false;
                vport.DataReceived += port_OnReceivedDatazz;
                vport.Open();

        if (!vport.IsOpen)
        {
            Console.WriteLine("VPort is closed");
        }

        for (var i = 0; i < s_pDataSent.Length; ++i)
        {
            s_pDataSent[i] = 0;
        }

        // populate s_pDataSent ...
        // I have left these steps out of this example
        // ...but they do exist in my test app

        port.Write(
            s_pDataSent,
            0,
            8);

        Console.ReadLine();
        Console.WriteLine("Closing");
        port.Close();
    }
}

当我使用 HyperTerminal 时,我可以看到在 2 个虚拟端口之间发送消息,但在真实端口和虚拟端口之间没有发送任何消息。

是否可以通过 com0com 或其他方式配对真实和虚拟 COM 端口?

如果是这样,我该如何解决我的问题?

是否有替代方法来伪造来自真实串口的输出?

最佳答案

您可以将物理端口更改为 7、8 和 9,并保留端口 1 2 3 硬编码,然后您可以安装 3 个虚拟 com 对,如 COM1-COM4、COM2-COM5、COM3-COM6 以“旧” "应用程序可以打开,您可以监控然后将读取的字节路由到另一个端口。

旧应用程序 -> COM1 -> COM4 -> 你的应用程序 -> COM7(打印机)

关于c# - 在真实和虚拟串行端口之间创建一对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40931155/

相关文章:

c# - 检测 SerialPort 何时准备好执行下一个命令

c# - 无法连接到mysql数据库C#

android - 使用 HC-05 将连续数据从 arduino 发送到 Android 应用程序

unit-testing - Grails - 什么是 mixin 及其在 Grails 测试中的意义?

C# 异步/等待 : Leave AsyncLocal<T> context upon task creation

c# - 如何对一系列依赖于用户输入并相互依赖的进程使用控制反转?

sql-server - Testcafe - 如何在所有装置运行后运行代码

testing - 我应该如何客观地测试我的程序结果?

c# - 在 C# 中列出问题。如何在 C# 中执行此操作

c# - 使用带参数的自定义操作时,MSI 安装程序找不到 InstallState