2

我目前正在测试我为一个小酒吧编写的 Java/MySQL POS 系统,并且在提取现金时遇到了问题。

钱箱有一个通过 USB-> 串行盒连接的 RJ11 插头,向设备写入任何数据都会触发抽奖打开。

我在使用 RXTX 时遇到问题,不确定是我的代码、库还是设备驱动程序?

理想情况下,我希望在用户登录系统时创建连接,并在他们注销时关闭,但目前,代码只是打开连接,写入数据并在销售启动时关闭(点击保存按钮和抽屉打开之间有 1-2 秒的延迟,这令人沮丧)。

当应用程序第一次启动时,抽屉对于一些销售工作正常(尚未确定模式),但随后停止工作。它显示了发生的一系列异常,混合了 NoSuchPort、PortInUse 或只是一个普通的 AccessDenied 消息。通常,重新启动应用程序并断开/重新连接 USB 将使其再次工作以增加销售量。

我可以使用超级终端连接到设备,并且它始终如一地工作,没有任何问题。

Java代码:

public static void openTill() {
    try {
        portId = (CommPortIdentifier) CommPortIdentifier.getPortIdentifier("COM3");
        serialPort = (SerialPort) portId.open("DRAWER_PORT", 2000);

        outputStream = serialPort.getOutputStream();

        serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

        serialPort.setRTS(false);
        serialPort.setInputBufferSize(8192);
        serialPort.setOutputBufferSize(8192);
        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_XONXOFF_IN | SerialPort.FLOWCONTROL_XONXOFF_OUT);

        outputStream.write("k".getBytes());
        outputStream.close();
        outputStream = null;

        serialPort.close();
        serialPort = null;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

我尝试了一些不同的设置,试图尽可能地模仿超级终端使用的设置(通过检查 PortMon),但仍然无法正常工作。

任何建议将不胜感激!

谢谢,瑞恩。

4

2 回答 2

1

找不到代码有什么问题,但我可以建议一些调试起点:

  • 使用 Sun 的(errr.. Oracle 的)javax.comm 实现尝试相同的代码。Windows 版本不再可以从他们的网站下载,但仍然可以在其他地方找到。即使您不想在最终设置中使用此实现,它也可能会帮助您找到问题。还有其他选择,例如SerialIO

  • 使用com0com安装虚拟 com 端口。启用日志记录(参见README.txt 文件中的最后一个问题)。将使用代码时的日志与使用超级终端时获得的日志进行比较,并查找任何差异。

  • 尝试不同的串行 -> USB 转换器。根据我的经验,其中许多没有正确实现 RS232,或者有很多错误。

编辑:

如果您发现这实际上是一个 rxtx 错误,但由于某种原因不想切换到另一个 javax.comm 实现(我已经看到这种情况发生 :-)这里有一些可能有用的附加提示(我会尝试无论如何,上述建议首先):

  • 是否需要调用setInputBufferSize, setOutputBufferSize?尝试删除它们。设备是否实际使用 XON/XOFF 流控制?如果没有,请尝试将流控制设置为无。设备是否需要禁用 RTS?如果没有,也请删除此行。另外,在打开输出流之前尝试设置串口参数。当然,这些都不应该有任何区别,但是您可能会触发一些 rxtx 错误。

  • 问题是否与按顺序打开和关闭端口多次有关?您可以尝试保持端口始终打开。在每次销售中,只需执行以下操作:

    outputStream.write("k".getBytes());
    outputStream.flush();
    

    并查看问题是否仍然存在。

于 2010-09-23T07:06:53.117 回答
1

您应该尝试 jSSC:http ://code.google.com/p/java-simple-serial-connector/ (与 SerialIO 不同,它是免费的)。

我也有很多关于 rxtx 串行和 USB 串行转换器的问题(这是其中之一),所以我只是从 rxtx 迁移到这个,它工作得很好!将 DLL 集成到适用于 Windows、Linux、Mac 和 Solaris 的 .jar 中,并具有系统自动检测功能。

最新的官方版本不支持超时,但是我联系了开发者,他给我发了一个jar版本,超时实现非常快!

迁移非常简单,现在效果更好(:

于 2012-10-05T16:53:27.450 回答