我目前正在测试我为一个小酒吧写的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),但仍然不能正常工作。
任何建议都将不胜感激!
谢谢, 莱恩。
答案 0 :(得分:1)
找不到代码有什么问题,但我可以为调试提出一些起点:
在Sun的(errr .. Oracle的)javax.comm实现中尝试相同的代码。 Windows版本不再可从其网站下载,但仍可在其他位置找到。即使您不想在最终设置中使用此实现,也可以帮助您找到问题。还有其他替代方案,例如SerialIO。
使用com0com安装虚拟COM端口。启用日志记录(请参阅README.txt file中的最后一个问题)。将代码与使用HyperTerminal时获得的日志进行比较,并查看差异。
尝试不同的序列 - > USB转换器。根据我的经验,其中许多都没有正确实现RS232,或者有很多错误。
修改强>
如果您发现这实际上是一个rxtx错误,但由于某种原因不想切换到另一个javax.comm实现(我已经看到这种情况发生:-)这里有一些可能有用的附加提示(我会首先尝试上述建议):
是否需要拨打setInputBufferSize
,setOutputBufferSize
?尝试删除它们。设备是否实际使用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中。
最新的官方版本不支持超时,但我联系了开发人员,他给我发了一个罐子版本,实现了很快的超时!
迁移非常简单,现在它的工作要好得多(: