2016-12-02 63 views
2

我就可以自动遗留应用程序的测试实用工作之间的一对。传统应用程序在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端口配对?

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

有没有其他的方法来伪造真实串口的输出?

+0

为什么要配对真实和虚拟端口?你究竟想要做什么?你想嗅探发送到PC上某个串口的所有消息吗? – idanp

+0

@Iankank - 不,我想代表实际端口向连接的应用程序发送消息。我假设我可以配对一个虚拟端口,并写入此端口(以便它在真实端口上变为输出)。这是错的吗? – camelCase

+0

对我来说看起来没问题,com0com两个配对的虚拟端口有什么问题?为什么你需要第二个港口是真实的? – idanp

回答

0

我得到了一个完整的自动化测试系统启动和运行:

  • 使用com0com设置增加2个虚拟端口配对(COM6-COMD和COMI-COMJ)。
  • 编写一个简单的应用程序,通过在COMD上读取某些内容时将一组字节写回到COMD来模拟设备。写回的字节将是默认的“无所事事”字节,除非在COMJ上也读取了测试字节。
  • 为我的自动化测试脚本添加了能够在COMI上发送特定字节的功能。例如,表示正在阅读的5英寸钞票的字节或钞票无效。
  • 使用十六进制编辑器修改旧版可执行文件以将“COM2:”ascii字符串(即硬编码端口)替换为“COM6:”。

我现在可以将测试终端设置为使用原始遗留应用程序进行手动测试。所有设备都能正常工作。在同一个终端上,自动测试脚本链接到修改后的可执行文件。该可执行文件将使用仿真设备。

我需要维护一个“修改”的可执行文件,直到完成工作以使COM端口在应用程序中可配置为止。

一个小问题是,我需要在修改的exe中使用“真实”COM端口名称。例如,我不能使用“COMA”。它需要是COM1到COM9。

0

快速和肮脏的解决方案,而不是使用com0com:

只需将PC端口(COM6)到另一个端口(的COMx)使用crossover cable( “零调制解调器”)中的一个(交换Tx和Rx) 。 现在您可以使用两个端口,它们通过两个不同的应用程序相互连接,一个端口上发送的每个字节都会在另一个端口上接收,反之亦然。

而且这两个端口都是真实的。

您现在可以使用另一个使用COMx的应用程序模拟您的设备。

+0

因此,将字节发送到COMx将由正在侦听COM2的原始传统应用程序读取? – camelCase

+0

显示OP希望将应用程序com端口连接到真实设备。 – barny

+1

@camelcase是的。 – idanp

1

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

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