有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java/RXTX问题Windows XP

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

现金抽屉有一个通过USB连接的RJ11插头->;串行框,并将任何数据写入设备会触发绘图打开

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

我尝试了几种不同的设置,试图尽可能接近超级终端使用的设置(通过检查PortMon),但仍然不起作用

如有任何建议,将不胜感激

谢谢, 瑞安


共 (2) 个答案

  1. # 1 楼答案

    找不到代码有任何错误,但我可以建议调试的一些起点:

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

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

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

    编辑:

    如果您发现这实际上是一个rxtx错误,但出于某种原因不想切换到另一个javax。comm实现(我看到了这种情况:-)以下是一些可能有用的额外提示(无论如何,我会先尝试上面的建议):

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

    • 问题是否与多次顺序打开和关闭端口有关?你可以试着保持端口一直打开。每次销售时,只需执行以下操作:

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

      看看问题是否还会重现

  2. # 2 楼答案

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

    我在rxtx串行和usb串行转换器方面也有很多问题(this was one of those),所以我刚从rxtx迁移到这个,它工作得非常好!将DLL集成到。适用于Windows、Linux、Mac和Solaris的jar,具有系统自动检测功能

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

    迁移非常简单,现在工作得更好了(: