Java / RXTX问题Windows XP

时间:2010-09-22 15:58:37

标签: java rxtx

我目前正在测试我为一个小酒吧写的Java / MySQL POS系统,并且现金抽奖存在问题。

现金抽屉有一个RJ11插头,通过USB->串口盒连接,将任何数据写入设备触发抽奖打开。

我遇到了RXTX的问题,并且不确定它是否是我的代码,设备的库或驱动程序?

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

当应用程序首次启动时,抽屉可以正常进行一些销售(尚未识别模式),但随后停止工作。它显示了一系列异常,混合了NoSuchPort,PortInUse或只是一个普通的AccessDenied消息。通常,重新启动应用程序并断开/重新连接USB将使其再次运行以进行更多销售。

我可以使用HyperTerminal连接到设备,它可以一致地工作,没有任何问题。

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();
    }
}

我尝试过几种不同的设置,尽量模仿HyperTerminal使用的设置(通过检查PortMon),但仍然不能正常工作。

任何建议都将不胜感激!

谢谢, 莱恩。

2 个答案:

答案 0 :(得分:1)

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

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

  • 使用com0com安装虚拟COM端口。启用日志记录(请参阅README.txt file中的最后一个问题)。将代码与使用HyperTerminal时获得的日志进行比较,并查看差异。

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

修改

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

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

  • 问题是多次依次打开和关闭端口?您可以尝试保持端口始终打开。在每次销售中,只需:

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

    看看问题是否仍然存在。

答案 1 :(得分:1)

你应该尝试jSSC:http://code.google.com/p/java-simple-serial-connector/(它与SerialIO不同)。

我有很多问题(this was one of those)也有rxtx串口和usb-serial转换器,所以我只是从rxtx迁移到这个,它运行得很好!通过系统自动检测将集成的DLL集成到Windows,Linux,Mac和Solaris的.jar中。

最新的官方版本不支持超时,但我联系了开发人员,他给我发了一个罐子版本,实现了很快的超时!

迁移非常简单,现在它的工作要好得多(: