我希望能够连接到多个相同的设备,以便我的程序充当所有这些设备的控制器。我编写了一个程序,允许我通过 RS232 连接到设备。我在 Windows Vista 笔记本电脑上使用带有 Java Comms 的 java 1.7 运行它。我使用 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 的不同实例。我可以使用一些帮助,因为我不知道从哪里开始。我目前没有做任何多线程处理(因为我不确定这是否可以解决我的问题),我应该这样做吗?欢迎所有建议。如果您需要更多代码才能提供帮助,我很乐意提供。