Здравствуйте! Подскажите пожалуйста, в чем может быть проблема (уже два дня мучаюсь, не могу сообразить) У меня есть поток, который в зависимости от некоторых значений меняет картинку на одной панели. Возникает ошибка: Exception in thread "Win32SerialPort Notification thread" java.lang.NullPointerException at COM.COMReceiveAndChange.ChangingPanels(COMReceiveAndChange.java:113) at COM.COMReceiveAndChange.serialEvent(COMReceiveAndChange.java:189) at com.sun.comm.Win32SerialPort.sendDataAvailEvent(Win32SerialPort.java:649) at com.sun.comm.NotificationThread.run(Win32SerialPort.java:878) Вот код: | Код | package subfunctions;
import javax.swing.*; import java.awt.*; import java.awt.event.*;
public class KeyPanel1 extends JPanel {/** * панель, показывающая состояние переключателя */ private boolean key_state = false; private boolean is_S2; /**@param * key_state - состояние переключателя - вкл = true,выкл = false * is_S2 - все переключатели вертикальны, и только S2 горизонтальн. */ public KeyPanel1(int x1,int y1, boolean isS2) { is_S2 = isS2; this.setSize(54, 54); this.setLocation(x1,y1); this.setBorder(BorderFactory.createRaisedBevelBorder()); this.setOpaque(false); } public void setKeyState(byte k_st) { key_state = (k_st==1)?true:false; } public boolean getKeyState() { return key_state; } protected void paintComponent(Graphics gr) { if (is_S2) paintHorizontalKey(gr); else paintVerticalKey(gr); } private void paintVerticalKey(Graphics gr) { ....... } private void paintHorizontalKey(Graphics gr) { ....... } }
package thread; <import всего, что нужно>
public class DiscretSignalsThread extends Thread {
private CommPortIdentifier portId; private SerialPort serialPort; private String msgHex; //данные, отправляемые com-порту, записанные в 16теричной с.с., биты разделены пробелом public DiscretSignalsThread(){ super("Discret Signals reader"); this.setDaemon(false); try { portId = CommPortIdentifier.getPortIdentifier("COM1"); serialPort = (SerialPort) portId.open("COMReceive", 2000); } catch (NoSuchPortException e) { e.printStackTrace(); } catch (PortInUseException e) { e.printStackTrace(); } this.start(); }
public void run(){ byte[] signals = new byte[16]; long lastTime = System.currentTimeMillis(); COMSend comS = new COMSend(serialPort); COMReceiveAndChange comR = new COMReceiveAndChange(serialPort); while (Globals.isDiscretSignalsWork()){ if (System.currentTimeMillis()-lastTime>=5000){ comS.ComWrite("23 2a 2a 0d"); //передали #**(пр конца строки) - команду на синхр ввод данных comS.ComWrite("24 30 31 34 0d"); //передали $014(пр конца строки) - команду на чтение синхр данных lastTime=System.currentTimeMillis(); synchronized(this) { comR.ComRead(); } } } } public static void main(String[] args) { DiscretSignalsThread ds = new DiscretSignalsThread(); }
}
package COM;
<import>
public class COMReceiveAndChange implements SerialPortEventListener{
private byte[] discretSignals = new byte[16]; private InputStream inputStream; private SerialPort serialPort; private boolean hasListener = false; private static boolean DSUpdated = false; private Map<String,String> HexASCIIMap; // таблица соотв между hex-кодами и кодами клавиш ASCII private ByteToBit btb; public COMReceiveAndChange(CommPortIdentifier portId){ fillCollection(); btb = new ByteToBit(); try { serialPort = (SerialPort) portId.open("COMReceive", 2000); } catch (PortInUseException e) { e.printStackTrace(); } } public COMReceiveAndChange(SerialPort sPort){ fillCollection(); btb = new ByteToBit(); serialPort = sPort; } private void fillCollection(){ HexASCIIMap = new HashMap<String, String>(); HexASCIIMap.put("30","0"); HexASCIIMap.put("31","1"); HexASCIIMap.put("32","2"); HexASCIIMap.put("33","3"); HexASCIIMap.put("34","4"); HexASCIIMap.put("35","5"); HexASCIIMap.put("36","6"); HexASCIIMap.put("37","7"); HexASCIIMap.put("38","8"); HexASCIIMap.put("39","9"); HexASCIIMap.put("41","a"); HexASCIIMap.put("42","b"); HexASCIIMap.put("43","c"); HexASCIIMap.put("44","d"); HexASCIIMap.put("45","e"); HexASCIIMap.put("46","f"); HexASCIIMap.put("00","d"); //признак конца строки } public void ComRead(){ try { inputStream = serialPort.getInputStream(); } catch (IOException e) { e.printStackTrace(); } if (!hasListener){ try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { e.printStackTrace(); } hasListener = true; } serialPort.notifyOnDataAvailable(true); try { // устанавливаем параметры порта serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); } } public SerialPort getSerialPort(){ return serialPort; } private void ChangingPanels(){ if (DSUpdated) { try{ // ВОТ В ЭТОМ МЕСТЕ ВОЗНИКАЕТ ОШИБКА. ПРИ ОБРАЩЕНИИ К setKeyState, getKeyState //ПРИЧЕМ ДАЖЕ ПРИ ВЫЗОВЕ ПРОСТО Globals.getkpS1() ОШИБКИ НЕТ. НЕ МОГУ ПОНЯТЬ.... Globals.getkpS1().setKeyState(discretSignals[5]); } catch (Exception ex) {System.out.println(ex);} DSUpdated = false; } } public void serialEvent(SerialPortEvent event) { /** * считываются данные, байты, отвечающие за * состояние переключателей, переводятся в массивы битов, четыре певых бита * каждого байта заносятся в результирующий массив состояний SignalsData */ String code = ""; if (event.getEventType()==SerialPortEvent.DATA_AVAILABLE){ //событие - поступили новые данные byte[] readBuffer = new byte[9]; byte[] bits = new byte[8]; try { while (inputStream.available() > 0) { inputStream.read(readBuffer); } int i=0; String bt = Integer.toString((readBuffer[i] & 0xff) + 0x100, 16).substring(1); //переводим байты в шестнадцатеричную сс if (bt.equals("21")){ //все ОК, команда выполнена, правильные данные получены i++; bt = Integer.toString((readBuffer[i] & 0xff) + 0x100, 16).substring(1); //если 0 - данные читаются в первый раз, 1 - читаются повторно if (bt.equals("30")){ i++; while ((!bt.equals("00"))&&(i<readBuffer.length)){ bt = Integer.toString((readBuffer[i] & 0xff) + 0x100, 16).substring(1); code = HexASCIIMap.get(bt); //code - символ, соотв полученному 16-тиричному коду bits = btb.byteToBit(Byte.parseByte(code,16)); switch (i){ case 2:for (int j = 0; j<4;j++) //i=2 - элементы от 15 до 12 discretSignals[j+12]=bits[j]; break; case 3:for (int j = 0; j<4;j++) //i=3 - элементы от 11 до 8 discretSignals[j+8]=bits[j]; break; case 4:for (int j = 0; j<4;j++) //i=4 - элементы от 7 до 4 discretSignals[j+4]=bits[j]; break; case 5:for (int j = 0; j<4;j++) //i=5 - элементы от 3 до 0 discretSignals[j]=bits[j]; break; }//записываем в массив SignalsData (зав от i) i++; } } DSUpdated = true; } } catch (IOException e) { e.printStackTrace(); } ChangingPanels(); } } }
|
Это сообщение отредактировал(а) tusenok - 17.3.2009, 09:52
|