6

我们正在尝试模拟 POS 键盘,以便将应用程序与现有的销售点应用程序集成。

我们遇到了这个软件:Virtual Serial Port Kit

它基本上创建了一个虚拟串行端口对,以便发送到 COM1 的数据可以从 COM4 出来,反之亦然。这允许我们的应用程序通过 COM4 发送数据,以向 POS 应用程序显示它正在与 COM1 上的键盘通话。

非常巧妙,但似乎有某种信号正在发生,我们无法用 .Net System.IO.Ports.SerialPort 类复制......

从串口监控程序中我们可以看出,启动顺序是这样的:

  1. 8字节命令发送到键盘
  2. 键盘哔声
  3. 从键盘发出某种信号
  4. 第二个 8 字节命令被发送到键盘,由信号触发
  5. 键盘回复设备和版本信息

当使用我们的虚拟串口时,我们无法弄清楚如何复制从键盘发送的信号。我们可以看到所有数据都正确通过,因此我们相信我们的 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答案标记为答案,因为它极大地帮助我们找到了解决方案。

4

2 回答 2

4

编辑以从模拟键盘的角度提供更多视角。

碰巧我在遥远的过去为 92R 键盘编写了低级驱动程序。

您确实需要专有协议的文档才能正确执行此操作 - 例如,发送到键盘的命令包含序列号和校验和。我建议联系富士通并尝试获取此文档。

根据您的描述:

  • 您发送的第一个 8 字节命令可能是一个重置命令(因为它导致键盘发出哔哔声)。键盘发送响应以确认命令,然后自行重置。

  • 发送复位命令后,POS 应用程序需要等待键盘复位(我认为大约 3000 毫秒),然后才能发送其他命令。

  • 看起来第二次发送是请求固件版本的命令。

  • 在键盘实际发送击键之前,POS 应用程序还需要随后发送命令以启用“自动输入”。

  • 还有一些命令可用于请求键锁位置、使音源发声、启用/禁用 MSR 以及写入可选的嵌入式 2 行显示器。因此,您的模拟器需要能够重现对这些命令的响应。

  • 一旦 POS 应用程序启用了“自动输入”,键盘将在按下击键(或键锁位置更改或 MSR 输入)时发送未经请求的消息。IIRC 这些消息还有一个序列号和校验和,您需要在模拟器中重现它们。

我知道的唯一信号是键盘在准备好接收数据时会提高 CTS。如果您在 PC 上连接两个端口,则需要一根特殊的零调制解调器电缆(见下文),以便当您的模拟器在 COM4 上提高 RTS 时,它将被视为另一个端口上的 CTS。

TeamPOS 主板上的 COM 端口为键盘供电。您可能不想将这些引脚连接到 COM4 端口,因此我建议使用仅连接以下引脚的空调制解调器电缆:

2(发送数据)- 3(接收数据)

3(接收数据)- 2(发送数据)

7 (RTS) - 8 (CTS)

8 (CTS) - 7 (RTS)

于 2009-08-20T17:25:46.047 回答
0

我已经多年没有进行串口开发了,但是当我这样做时,我总是使用交叉电缆和第二台运行 Windows 超级终端的 PC。

于 2009-08-20T16:35:09.033 回答