我就可以自動遺留應用程序的測試實用工作之間的一對。傳統應用程序在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