Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Win32SerialPort Notification Thread: NullPointerEx, ошибка при обращен к проц другого модуля 
V
    Опции темы
tusenok
Дата 17.3.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



Здравствуйте! Подскажите пожалуйста, в чем может быть проблема (уже два дня мучаюсь, не могу сообразить)
У меня есть поток, который в зависимости от некоторых значений меняет картинку на одной панели. 
Возникает ошибка:
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
PM MAIL   Вверх
Platon
Дата 17.3.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Вам же четко написана ошибка NullPoinerException в файле COMReceiveAndChange.java, строке 113
PM MAIL ICQ   Вверх
tusenok
Дата 17.3.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



Я знаю, ГДЕ ошибка,  и в комментах к коду указала это место.  Я не могу понять ПОЧЕМУ она возникла, и следовательно, КАК ее исправить
PM MAIL   Вверх
Platon
Дата 17.3.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Судя по всему, Globals.getkpS1() выдает null

Добавлено через 25 секунд
Посмотрите как работает эта функция.
PM MAIL ICQ   Вверх
tusenok
Дата 17.3.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



И правда, null... Platon, спасибо   smile   буду искать причину  smile 

Это сообщение отредактировал(а) tusenok - 17.3.2009, 10:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.