问题描述
我正在编写的这个用于监视串行设备输出的小程序遇到问题。我正在使用jSerialComm库,但出现错误(不会使程序崩溃,它会继续运行)。错误如下(我不确定它是否与串行相关,因为我看到摆动很多,但是错误每隔5秒钟左右触发一次(每次我从设备接收到新的数据字符串时):
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.desktop/javax.swing.plaf.synth.SynthLookAndFeel.paintRegion(SynthLookAndFeel.java:376)
at java.desktop/javax.swing.plaf.synth.SynthLookAndFeel.update(SynthLookAndFeel.java:340)
at java.desktop/javax.swing.plaf.synth.SynthTextFieldUI.update(SynthTextFieldUI.java:179)
at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5255)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedFPScales(RepaintManager.java:1707)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1616)
at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5203)
at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5013)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:865)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventdispatchThread.pumpOneEventForFilters(EventdispatchThread.java:203)
at java.desktop/java.awt.EventdispatchThread.pumpEventsForFilter(EventdispatchThread.java:124)
at java.desktop/java.awt.EventdispatchThread.pumpEventsForHierarchy(EventdispatchThread.java:113)
at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:109)
at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:101)
at java.desktop/java.awt.EventdispatchThread.run(EventdispatchThread.java:90)
现在,所有这些链接的代码行都不在我编写的代码中,所以我不确定如何调试它们。
这是我的代码:
private void btn_refreshActionPerformed(java.awt.event.ActionEvent evt) {
// Re Query the COM ports to see available ports.
updateStatus("Port List Updated");
comPortList = SerialPort.getCommPorts();
dropDownPorts.removeAllItems();
for (SerialPort value: comPortList) {
dropDownPorts.addItem(value.getSystemPortName());
}
public void connectPort(int index) {
System.out.println("Attempting to connect to Index:" + index);
int baudrate = 115200;
SerialPort comPort = comPortList[index];
currentConnectedPort = comPort;
comPort.openPort();
comPort.setParity(SerialPort.NO_PARITY);
comPort.setNumStopBits(SerialPort.ONE_STOP_BIT);
comPort.setNumDataBits(8);
comPort.addDataListener(this);
comPort.setBaudrate(baudrate);
System.out.println("Connection successful!");
updateStatus("Connected!");
}
@Override
public int getListeningEvents() {
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
}
@Override
public void serialEvent(com.fazecast.jSerialComm.SerialPortEvent event) {
System.out.println("Serial Event triggered!");
if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
System.out.println("Event type is not LISTENING EVENT");
return;
}
int bytesAvailable = currentConnectedPort.bytesAvailable();
if (bytesAvailable <= 0) {
System.out.println("Bytes available <= 0");
return;
}
int bytesRead = currentConnectedPort.readBytes(buffer,Math.min(buffer.length,bytesAvailable));
String response = new String(buffer,bytesRead);
System.out.println("Response received is");
System.out.println(response);
parseData(response);
}
由于我看到太多的挥杆标注,我认为这可能是我的UI?
这是我的GUI代码
public void updateGUI() {
// triggered by parser
streamRx += newLine;
txt_rawOutput.setText(streamRx);
if (values.length > 52) {
System.out.println("received values string");
txt_coilIn.setText(values[8]);
txt_coilOut.setText(values[9]);
txt_coilCtrl.setText(values[6]);
txt_compressorCtrl.setText(values[11]);
txt_compressorActual.setText(values[12]);
txt_fan1Pwr.setText(values[2]);
txt_fan2Pwr.setText(values[4]);
txt_freezerTemp.setText(values[22]);
txt_fridgeTemp.setText(values[31]);
txt_targetTemp.setText(values[20]);
txt_timeStamp.setText(values[0]);
txt_ambientTemp.setText(values[72]);
txt_heater1Pwr.setText(values[46]);
txt_heater2Pwr.setText(values[50]);
txt_freezerPan.setText(values[48]);
txt_fridgePan.setText(values[52]);
txt_coilIn.updateUI();
txt_coilOut.updateUI();
txt_coilCtrl.updateUI();
txt_compressorCtrl.updateUI();
txt_compressorActual.updateUI();
txt_fan1Pwr.updateUI();
txt_fan2Pwr.updateUI();
txt_freezerTemp.updateUI();
txt_fridgeTemp.updateUI();
txt_targetTemp.updateUI();
txt_timeStamp.updateUI();
txt_ambientTemp.updateUI();
txt_heater1Pwr.updateUI();
txt_heater2Pwr.updateUI();
txt_freezerPan.updateUI();
txt_fridgePan.updateUI();
}
//UPDATE UI
txt_rawOutput.updateUI();
txt_rawOutput.setCaretPosition(txt_rawOutput.getDocument().getLength() - 1);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)