我们正在尝试模拟 POS 键盘,以便将应用程序与现有的销售点应用程序集成。
我们遇到了这个软件:Virtual Serial Port Kit
它基本上创建了一个虚拟串行端口对,以便发送到 COM1 的数据可以从 COM4 出来,反之亦然。这允许我们的应用程序通过 COM4 发送数据,以向 POS 应用程序显示它正在与 COM1 上的键盘通话。
非常巧妙,但似乎有某种信号正在发生,我们无法用 .Net System.IO.Ports.SerialPort 类复制......
从串口监控程序中我们可以看出,启动顺序是这样的:
- 8字节命令发送到键盘
- 键盘哔声
- 从键盘发出某种信号
- 第二个 8 字节命令被发送到键盘,由信号触发
- 键盘回复设备和版本信息
当使用我们的虚拟串口时,我们无法弄清楚如何复制从键盘发送的信号。我们可以看到所有数据都正确通过,因此我们相信我们的 SerialPort 对象上的设置是正确的。这是我们的 SerialPort 设置的片段:
_port.BaudRate= 9600;
_port.Parity = Parity.None;
_port.DataBits = 8;
_port.StopBits = StopBits.One;
_port.DtrEnable = true;
_port.RtsEnable = true;
我们还注意到,在使用portmon 时,我们看到了一个 GET_MODEM_STATUS 请求,这是 POS 应用程序在发送第二个命令之前正在等待的请求。
关于如何诊断这个的任何想法?由于我们使用的是 .NET,因此整个情况比我们习惯的要低一些。
更新:我还想指出,我们在这里尝试了 SDK:Franson Serial Tools,但使用此 SDK 时我们甚至无法获取数据。
更新:我们已经放弃使用任何类型的虚拟串行端口。我们已经获得了一条从 POS PC 连接到另一台 PC 的电缆,并且可以看到通过的数据来模拟键盘。现在我们的问题是,我们无法弄清楚如何发出键盘已准备好接收数据的信号,正如最佳答案所提到的那样。似乎 POS 应用程序发送命令发出哔声,并等待最多 3 秒等待信号。所以在与我们的应用程序交谈时会超时,但在与真正的键盘交谈时不会
我们如何使用 SerialPort 类做到这一点?我们已经将 DtrEnable 和 RtsEnable 设置为 true,还需要设置其他内容吗?还是我们必须使用较低级别的串行端口 p/invoke 来完成此操作?
解决方案:
_port.RtsEnabled = false;
Thread.Sleep(1000);
_port.RtsEnabled = true;
这使得 POS 应用程序认为键盘已插入,这是有道理的。我将#1答案标记为答案,因为它极大地帮助我们找到了解决方案。