- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们正在尝试模拟 POS 键盘,以便将应用程序与现有的销售点应用程序集成。
我们遇到了这个软件:Virtual Serial Port Kit
它基本上创建了一个虚拟串行端口对,以便发送到 COM1 的数据可以从 COM4 传出,反之亦然。这允许我们的应用程序通过 COM4 发送数据,以向 POS 应用程序显示它正在与 COM1 上的键盘通话。
非常巧妙,但似乎有某种信号正在发生,我们无法使用 .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;
我们还注意到使用 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 个答案标记为答案,因为它极大地帮助我们找到了解决方案。
最佳答案
已编辑,从模拟键盘的角度提供更多视角。
碰巧我在遥远的过去为 92R 键盘编写了低级驱动程序。
您确实需要专有协议(protocol)的文档才能正确执行此操作 - 例如,发送到键盘的命令包含序列号和校验和。我建议联系富士通并尝试获取此文档。
根据您的描述:
您发送的第一个 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)
关于C# SerialPort - 模拟 pos 键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307206/
我有一个 SerialPort 用于连接到虚拟 COM 端口。由于连接是持久的,我必须保留对 SerialPort 的引用,以便打开、关闭和管理端口。我还在我的类上实现了 IDisposable(不是
我正在尝试使用node.js串行端口模块在运行时获取设备的COM端口。 const SerialPort = require('serialport'); var fs = require('fs')
我目前有一个使用 VB6 代码制作的程序,该程序使用 MSCOMM 控件从串行端口拉回数据。这成功地从我的串行端口接收数据,其中连接了 Denso BHT-904B 设备。 我现在正尝试将此代码移至
从 SerialPort 对象外部看,写入缓冲区的大小以及是否已满似乎没有区别。 使用同步写入,write 方法会阻塞,直到所有数据都已发送且缓冲区为空。 使用异步写入,数据排队,程序继续运行。直到写
我正在用 C# 开发一个 .NET 4.0 WPF 应用程序,它通过 RS232 控制电机。我在退出应用程序时遇到问题,应用程序有时会在关闭端口时死锁。 在互联网上进行一些研究后,我注意到这是一个常见
这个问题的灵感来自这里的问题和答案: Passing a Command to a Comm Port Using C#'s SerialPort Class 这个问题本身回答了我遇到的一些问题,但也
假设我们有以下代码: SerialPort port = new SerialPort("COM2", 115200); port.Open(); // Thread.Sleep(5000); //
使用串行端口库的人注意到了这一点,还是只有我?我发现(非常)很少有人处于相同的情况,但我没有找到解决方案。 这是我使用 ruby serialport 得到的示例: ff d8 ff e0 00
我正在使用 Ruby 1.8.7 SerialPort gem 通过 FTDI232 USB 转串口转换器与 AVR 通信。我似乎遇到了 SerialPort 初始化新 SerialPort 的问题。
我正在开发需要与 COM 端口交互的程序。 从这个问答中学习:.NET SerialPort DataReceived event not firing , 我这样写我的代码。 namespace C
我正在监听串口 5 个字节的信息。轮询的完整答案需要 5 个字节。我的代码监听 serialport data_received 事件并检查 bytesToRead。有时,事件会触发并且 bytesT
我有一个 USB 电话连接到我的电脑上 我如何使用串口检测它所在的 COM? 最佳答案 遍历所有 COM 端口并尝试从每个端口获取一个标识。下面是一个最小的示例,应该对其进行扩展以进行更好的错误检查等
因为我是多线程应用程序的新手,所以我想在开始编写代码之前从更有经验的人那里得到一些建议... 我需要在串口事件中对串口接收到的数据进行排队,以便进一步处理。 所以我有以下事件处理程序: voi
我正在开发需要与 COM 端口交互的程序。 从这个问答中学习:.NET SerialPort DataReceived event not firing , 我这样写我的代码。 namespace C
偶尔,我的一些集成测试会因上述消息而失败。我正在使用下面的代码来准备端口。 for(int i = 0; i < 5; i++) {
我有两个设备想通过串行接口(interface)连接,但它们的连接不兼容。为了解决这个问题,我将它们都连接到我的 PC,并且我正在开发一个 C# 程序,它将 COM 端口 X 上的流量路由到 COM
我在尝试让串行端口接收正确消息时遇到了很多问题。它不断截断消息。这是我的代码,我将在代码之后尝试详细说明。 public SerialComms(SerialPort sp) { this.sp
我正在使用串行通信,我想知道是否应该保持 SerialPort 打开? 我正在创建一个命令队列,一次只会运行一个。我应该创建一个 SerialPort 并在每个命令中打开/关闭它,还是应该有另一个类来
我一直在尝试使用模块 Win32::SerialPort在 perl 5.10 (也许它与 5.14 有一些问题)。我必须向串行端口发出命令并获取它们的输出。我已经发现 write 将为我完成前面的部
我有一个 WPF 测试应用程序,用于评估基于事件的串行端口通信(与轮询串行端口)。问题是 DataReceived 事件似乎根本没有触发。 我有一个非常基本的 WPF 表单,其中包含用于用户输入的 T
我是一名优秀的程序员,十分优秀!