jon*_*ers 5 .net c# keyboard serial-port point-of-sale
我们正在尝试模拟POS键盘,以便将应用程序与现有的销售点应用程序集成.
我们遇到了这个软件:虚拟串行端口套件
它基本上创建了一个虚拟串行端口对,以便发送到COM1的数据可以来自COM4,反之亦然.这允许我们的应用程序通过COM4发送数据,以显示它正在与COM1上的键盘通信的POS应用程序.
非常巧妙,但似乎有某种信号发生,我们无法使用.Net System.IO.Ports.SerialPort类复制...
从我们从串口监控程序中可以看出,这是启动序列的工作原理:
使用我们的虚拟串口时,我们无法弄清楚如何复制键盘发送的信号.我们可以正确地看到所有数据,因此我们认为我们的SerialPort对象上的设置是正确的.以下是我们的SerialPort设置的片段:
_port.BaudRate= 9600;
_port.Parity = Parity.None;
_port.DataBits = 8;
_port.StopBits = StopBits.One;
_port.DtrEnable = true;
_port.RtsEnable = true;
Run Code Online (Sandbox Code Playgroud)
我们还注意到,在使用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;
Run Code Online (Sandbox Code Playgroud)
这使得POS应用程序认为键盘已插入,这是有道理的.我将#1答案标记为答案,因为它极大地帮助我们找到了解决方案.
编辑以从模拟键盘的角度提供更多视角。
碰巧我很久以前就为 92R 键盘编写了低级驱动程序。
您确实需要专有协议的文档才能正确执行此操作 - 例如发送到键盘的命令包含序列号和校验和。我建议联系富士通并尝试获取此文档。
从你的描述来看:
您发送的第一个 8 字节命令可能是重置命令(因为它导致键盘发出蜂鸣声)。键盘发送响应以确认该命令,然后自行重置。
发送重置命令后,POS应用程序需要等待键盘重置(我认为大约3000ms)才能发送其他命令。
看起来第二次发送是请求固件版本的命令。
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)