【发布时间】:2018-04-13 01:19:43
【问题描述】:
我正在尝试使用 SwingWorker 通过串行端口读取数据。但是,在执行此代码后,我没有收到任何输出。通过添加行
JOptionPane.showConfirmDialog(null, "Cancel", "Cancel this task?", JOptionPane.DEFAULT_OPTION);
正如SwingWorker not executing doInBackGround() 中所建议的,我只收到输出“Reading”/n“Done”,并且我的 getPortText 方法没有被调用。用于显示可用端口的 IF 块也不会执行。
fazecast SerialComm JAR 可以在http://fazecast.github.io/jSerialComm/找到
非常感谢所有帮助,我已经坚持了好几天了!
import java.util.List;
import java.util.Scanner;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import com.fazecast.jSerialComm.SerialPort;
public class PortWorkerCheck {
public static void main(String[] args) {
Worker worker = new Worker();
worker.execute();
}
public static void getPortText(String dir) {
System.out.println(dir);
}
static class Worker extends SwingWorker<Void, String>{
boolean portcheck = false;
SerialPort comPort[] = SerialPort.getCommPorts();
SerialPort port;
protected void done() {
System.out.println("Done");
}
@Override
protected Void doInBackground() throws Exception {
String data;
//This if block attempts to list available ports and have the user select one.
if (portcheck = false) {
int i = 1;
System.out.println("Select a port:");
for(SerialPort ports : comPort) {
System.out.println(i++ + ". " + ports.getSystemPortName());
}
Scanner s = new Scanner(System.in);
int chosenPort = s.nextInt();
port = comPort[chosenPort - 1];
portcheck = true;
if(port.openPort()) {
System.out.println("Port opened successfully");
}
port.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);
}
publish("Reading");
Scanner read = new Scanner(port.getInputStream());
data = read.nextLine();
publish(data);
return null;
}
//My process should call getPortText, which should then display the received data.
@Override
protected void process(List<String> chunks) {
for(String line : chunks) {
portcheck = true;
PortWorkerCheck.getPortText(line);
}
}
}
}
【问题讨论】:
-
您没有运行 Swing GUI,因此当 main 方法退出时,此代码存在退出风险。您需要为 Swing 线程显示一个 Swing GUI 才能继续运行。
-
另外,你是不是应该只读取一行数据?
-
....而且这条线很糟糕:
if (portcheck = false) {。永远不要设置这样的布尔值。也许做if (portcheck == false) {或者更好if (!portcheck) { -
数据作为一系列单行流式传输到端口,如果您还记得您帮助我解决的上一个问题:stackoverflow.com/questions/49724665/…
-
您的代码只尝试读取 one 行。再次,请更改不正确的 if 块。您正在使用该行将布尔值设置为 false - 不好。
标签: java swing concurrency port swingworker