我正在开发一个可以自动测试遗留应用程序的实用程序。旧版应用程序在 Windows 2000 上运行,并使用通过串行 (COM) 端口连接的 3 个设备。
我可以访问应用程序的源代码,但无权进行任何更改。但是,源代码允许我验证设备 COM 端口名称是否已作为 COM1(打印机)、COM2(钞票阅读器)和 COM3(条形码/OMR 阅读器)硬编码到应用程序中。我还可以看到发送到每个设备的字节,以及应用程序如何处理返回。
现在,我想编写有关钞票阅读器的测试。我在这里阅读了各种问题(例如,伪造 RS232 串行端口),我可以使用 com0com 来伪造串行端口。我希望有一种方法可以代表应用程序接收的真实 COM 端口设备发送字节。
安装实用程序后,我将一对配置为“COM2”到“COM6”。COM2 标签显示为红色,当我按 OK 时,我收到以下消息:
端口名称 COM2 已用于其他设备 \Device\Serial1
然后我可以按取消、重试或继续。
按继续我得到:
端口名称 COM2 已在 COM 端口数据库中记录为“正在使用”
我再次按继续。
我用 C# 编写了一个小应用程序来测试 COM2 和 COM6 端口配对。当我向 COM2 发送有效字节时,我得到了预期的 11 个字节(这正好反映了遗留应用程序中的一个场景)。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();
}
}
当我使用超级终端时,我可以看到在 2 个虚拟端口之间发送消息,但在真实端口和虚拟端口之间没有发送任何消息。
是否可以通过 com0com 或其他方式配对真实和虚拟 COM 端口?
如果是这样,我该如何解决我的问题?
是否有替代真实串行端口输出的替代方法?