2014-02-08 3 views
0

Я был бы очень признателен, если кто-то может мне точку в правильном направленииСерийный Event Data Слушатель Java

Как бы я идти о вызывая событие, которое вызывается, когда никакие данные не получены из последовательного примера связи ниже?

Thank you, Maria.

public void connect(String portName) throws Exception { 
    CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); 
     if (portIdentifier.isCurrentlyOwned()) { 
      System.out.println("Error: Port is currently in use"); 
     } else { 
      CommPort commPort = portIdentifier.open(this.getClass().getName(), 
        2000); 
      if (commPort instanceof SerialPort) { 
       SerialPort serialPort = (SerialPort) commPort; 
       serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, 
         SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 

       InputStream in = serialPort.getInputStream(); 
       OutputStream out = serialPort.getOutputStream(); 
       theSerialWriter = new SerialWriter(this, out); 
       new Thread(theSerialWriter).start(); 

       serialPort.addEventListener(new SerialReader(this, in)); 
       serialPort.notifyOnDataAvailable(true); 
      } else { 
       System.out.println("Error: Only serial ports are handled by this       example."); 
      } 
     } 
    } 
     public void serialEvent(SerialPortEvent arg0) { 
      int data; 
      // boolean setFlagDoorLock = false ; 
      // if(arg0= 1){} 
      try { 
       int len = 0; 
       while ((data = in.read()) > -1) { 

        if (data == '\n') { 
         break; 
        } 
        buffer[len++] = (byte) data; 
        asHexStr = DatatypeConverter.printHexBinary(buffer); 
        if (asHexStr.contains("FB1")) { 
         // Thread.sleep(1000); 
         ActivateSystem = true; 
         if ((asHexStr.contains("FB1") && (ActivateSystem == true))) { 
          ActivateSystem = false; 
          asHexStr = ""; 
         } else { 
          System.out.println("Here2"); 
         } 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       System.exit(-1); 
      } 
      System.out.println("Received"); 
     } 
    } 
    public static class SerialWriter implements Runnable { 
     OutputStream out; 
     SerialPortConnector main = null; 

     public SerialWriter(SerialPortConnector twoWaySerialComm, 
       OutputStream out) { 
      main = twoWaySerialComm; 
      this.out = out; 
     }  
     public void send(String stringToSend) { 
      try { 
       int intToSend = Integer.parseInt(stringToSend); 
       this.out.write(intToSend); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     public void run() { 
      try { 
       int c = 0; 
       Thread.sleep(1000); 

       if (asHexStr == "") { 
        System.out.println("Here"); 
        // ActivateSystem = false; 
       } 
      } 
      // catch (IOException e) 
      catch (Exception e) { 
       e.printStackTrace(); 
       System.exit(-1); 
      } 
     } 
    } 
    public static void main(String[] args) { 
     try { 
      (new SerialPortConnector()).connect("COM12"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Пожалуйста, не переустанавливайте свой вопрос так, как вы это делали раньше: [Слушатель событий Java Serial Communication] (http://stackoverflow.com/questions/21638625/java-serial-communication-event-listener). Люди действительно хотят помочь вам, но это очень сложно (или невозможно), учитывая плохое описание вашей проблемы. * Мне нужно место для добавления вызова (или распечатки) ниже, которое вызывается только тогда, когда данные не читаются или не пусты? * 1) Если данных нет, то серийное событие не будет запущено. 2) Вы уверены, что устройство, с которым вы пытаетесь установить связь, - это удаление чистых данных? 3) Вы уверены, что серийное событие - правильный подход? – dic19

+0

Привет, Прежде всего, спасибо за ваш ответ, извините за повторную публикацию, как и все здесь. Я полагаю, что я просто отчаянно нуждался в ответе. Вы правы. Что я ищу - это событие, которое будет запущено, если нет данные считываются из серийного номера и как именно это можно сделать. – kelevra88

+0

Добро пожаловать и не беспокойтесь, мы постараемся помочь. Еще один вопрос, как устройство взаимодействует с последовательным портом? Я имею в виду, он все время отправляет данные или вам нужно отправлять команды на это устройство, а затем он отправит ответ? Эта информация полезна для определения наилучшего подхода. – dic19

ответ

1

Вы заявили об этом в комментарии:

мне нужно, чтобы быть в состоянии обнаружить, что идентификатор остановился и после тайм-аута (или после того, как он не обнаруживает идентификатор несколько раз в строка), то отправить URL-адрес вызова (я уже есть класс, чтобы отправить вызов) -это должен быть послан только once.while он читает идентификатор, однако другой URL вызова должен быть отправлен снова, только один раз

Если я понимаю это право, то вам нужно проверить на две разные вещи:

  • Устройство останавливается при отправке ID.
  • Устройство отправляет несколько пустых идентификаторов.

Это требование является своего рода сложным. Как я уже сказал, если никакие данные не поступают на последовательный порт, то никакое событие последовательного порта не будет запущено. Я думаю, вы можете использовать Timer, чтобы проверить таймаут и использовать счетчик, чтобы зарегистрировать количество пустых идентификаторов. Что-то вроде этого:

int numberOfEmptyIds = 0; 
int maxNumberOfAttempts = 5; 
boolean urlSent = false; 
long timeoutInMillis = 10000; // let's say 10000 millis, equivalent to 10 seconds 
Timer timer = null; 

public void connect(String portName) throws Exception { 
    ... 
    scheduleTimer(); 
} 

public void serialEvent(SerialPortEvent evt) { 
    if(evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) { 
     try { 
      while(in.read(buffer) > -1) { 
       String asHexStr = DatatypeConverter.printHexBinary(buffer); 
       if(asHexStr.contains("FB1")) { 
        scheduleTimer(); 
        numberOfEmptyIds = 0; 

       } else { 
        numberOfEmtyIds++; 
        if(numberOfEmptyIds == maxNumberOfAttempts && !urlSent) { 
         // send the url here 
        } 
       }    
      } 
     } catch (IOException ex) { 
      // Log the exception here 
     } 
    } 
} 

private void scheduleTimer() { 
    if(timer != null) { 
     timer.cancel(); 
    } 
    timer = new Timer("Timeout"); 
    TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      if(!urlSent) { 
       // send the url here 
      } 
     } 
    }; 
    timer.schedule(task, timeoutInMillis); 
} 

Я не знаю, если это именно то, что вам нужно, но надеюсь, что это будет полезно.

+0

Его точно, что я искал, Хорошая работа и Спасибо – kelevra88

+0

@ Maria88, пожалуйста! : D, если этот ответ достаточно хорош для вас, не забудьте «принять» его: [Как принимается ответ?] (Http://meta.stackexchange.com/a/5235) – dic19

Смежные вопросы