我就可以自动遗留应用程序的测试实用工作之间的一对。传统应用程序在Windows 2000上运行,并使用通过串行(COM)端口连接的3个设备。创建一个真实的和虚拟的串口
我有权访问应用程序的源代码,但没有进行任何更改。但是,源代码允许我验证设备COM端口名称作为COM1(打印机),COM2(钞票阅读器)和COM3(条形码/ OMR阅读器)硬编码到应用程序中。我还可以看到发送给每个设备的字节以及应用程序如何处理退货。
现在,我还想写关于钞票阅读器测试。我从这里的各种问题中读到(例如Faking an RS232 Serial Port),我可以使用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端口配对?
如果是这样,我该如何解决我的问题?
有没有其他的方法来伪造真实串口的输出?
为什么要配对真实和虚拟端口?你究竟想要做什么?你想嗅探发送到PC上某个串口的所有消息吗? – idanp
@Iankank - 不,我想代表实际端口向连接的应用程序发送消息。我假设我可以配对一个虚拟端口,并写入此端口(以便它在真实端口上变为输出)。这是错的吗? – camelCase
对我来说看起来没问题,com0com两个配对的虚拟端口有什么问题?为什么你需要第二个港口是真实的? – idanp