我希望能够连接到多个相同的设备,以便我的程序充当所有这些设备的控制器。 我写了一个程序,允许我通过RS232连接到设备。我用java运行它 1.7在Windows Vista笔记本电脑上使用Java Comms。我使用Startech的USB转RS232适配器(类型ICUSB2324X),它允许我有4个附加的COM端口/ RS232连接。当我一次只连接一个设备时,该程序可以正常工作。 一旦我连接到另一个COM端口上的附加设备,第二个设备就像它应该连接,但第一个连接似乎丢失了。我没有得到任何错误。
我有一个swing GUI,允许我添加一个jPanel的新实例(称为ControllerPanel),每个面板包含一个jCombobox,列出可用的COM端口,并允许您选择要连接的端口。我可以根据需要在框架中添加尽可能多的ControllerPanel,没有任何问题。所选端口存储为“preferredPort”。点击“connectButton”会在我的ControllerPanel类中触发这段代码(之后问题就会出现):
private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (!connectedToPort){
String preferredPort = jComboBox1.getSelectedItem().toString();
connectToPort(preferredPort);
}else{
try {
closeConnection();
} catch (IOException ex) {
Logger.getLogger(ControllerPanel.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
这会触发我的connectToPort方法
private void connectToPort(String preferredPort) {
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals(preferredPort)) {
try {
serialPort = (SerialPort) portId.open("deviceController", 2000);
} catch (PortInUseException e) {
System.err.println(e);
}
try {
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();
printStream = new PrintStream(outputStream);
} catch (IOException e) {
System.err.println(e);
}
try {
serialPort.addEventListener((SerialPortEventListener) this);
} catch (Exception e) {
System.err.println(e);
}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(38400,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {
System.err.println(e);
}
}
}
}
connectedToPort = true;
}
第一次连接到端口非常合适。当我尝试从新的ControllerPannel实例连接到新端口时,似乎终止了第一个连接。每次我尝试在另一个COM端口上连接其他设备时,都会终止现有连接。 我不明白第二个连接如何干扰第一个连接,因为两个连接都源自ControllerPanel的不同实例。我可以使用一些帮助,因为我不知道从哪里开始。我目前没有做任何多线程(因为我不确定这是否可以解决我的问题),我应该吗?欢迎所有建议。如果您需要更多代码才能提供帮助,我很乐意提供。
答案 0 :(得分:0)
我发现代表串行连接的变量设置为静态。我用private替换了关键字static,这解决了这个问题。