C#SerialPort - 模拟pos键盘

时间:2009-08-20 16:03:45

标签: c# .net keyboard serial-port point-of-sale

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

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

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

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

从串口监控程序可以看出,这就是启动顺序的工作原理:

  1. 发送到键盘的8字节命令
  2. 键盘发出哔哔声
  3. 从键盘发送某种信号
  4. 第二个8字节命令被发送到键盘,由信号
  5. 触发
  6. 键盘回复设备和版本信息
  7. 使用我们的虚拟串口时,我们无法弄清楚如何复制键盘发送的信号。我们可以正确地看到所有数据,因此我们认为我们的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才能完成此任务?

    SOLUTION:

    _port.RtsEnabled = false;
    Thread.Sleep(1000);
    _port.RtsEnabled = true;
    

    这使POS应用程序认为键盘已插入,这是有道理的。我会将#1答案标记为答案,因为极大帮助我们找到解决方案。

2 个答案:

答案 0 :(得分:4)

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

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

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

根据你的描述:

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

  • 发送重置命令后,POS应用程序需要等待键盘重置(我想大约3000ms)才能发送其他命令。

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

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

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

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

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

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

2(Tx数据) - 3(Rx数据)

3(Rx数据) - 2(Tx数据)

7(RTS) - 8(CTS)

8(CTS) - 7(RTS)

答案 1 :(得分:0)

我多年没有进行串口开发,但是当我这样做时,我总是使用Crossover Cable和第二台运行Windows超级终端的PC。