2016-02-02 7 views
0

Итак, после длительного периода исследований я смог сделать свой сканер RFID и обнаружить порты моего компьютера. Мне пришлось разделить код на 2 файла классов из-за двух файлов jar, имеющих разные функции:Вызов в классе Child, чтобы дождаться метки RFID

один предназначен для чтения идентификатора, а другой предназначен для чтения порта.

Теперь, когда у меня были они, все, что мне нужно было сделать, - это позвонить им в мой основной проект GUI. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что ребенок не будет ждать проверки идентификатора и вместо этого даст мне нулевое значение взамен. Я хочу сделать эту работу, поэтому я могу просто назвать свои дочерние классы в своем основном проекте.

вот мои коды:

RFID_Reader.java

import javax.swing.JOptionPane; 
import jssc.SerialPort; 
import jssc.SerialPortEvent; 
import jssc.SerialPortEventListener; 
import jssc.SerialPortException; 

public class RFID_Reader { 
    static SerialPort serialPort; 
    static String output; 
    public String FinalOutput; 

    //this probably is redundant and I am willing to remove it. 
    public void checkConnection(){ 
     RFID_Scan_HW jCom = new RFID_Scan_HW(); 
     serialPort = new SerialPort(jCom.collect_Ports("")); 
     startReading(); 
    } 

    //Configuring the serialPort 
    public void startReading(){ 
     try { 
      serialPort.openPort(); 
      serialPort.setParams(SerialPort.BAUDRATE_9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); 
      //verbose, just to get the output with no words. 
      serialPort.writeBytes("\002v0\003".getBytes()); 
      serialPort.closePort(); 

      serialPort.openPort(); 
      serialPort.setParams(9600, 8, 1, 0); 
      int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR; 
      serialPort.setEventsMask(mask); 
      serialPort.addEventListener(new SerialPortReader()); 
     } 
     catch (SerialPortException ex) { 
      System.out.println(ex); 
     } 
    } 

    //re-scan devices in port. if the device is not found, just try again. 
    public void rescanConnection(){ 
     RFID_Scan_HW jCom = new RFID_Scan_HW(); 
     if(jCom.collect_Ports("")==""){ 
      JOptionPane.showMessageDialog(null, "No Scanner found. Please try again"); 
     }else{ 
      serialPort = new SerialPort(jCom.collect_Ports("")); 
      startReading(); 
     } 
    } 

    //read the input from the device. 
    class SerialPortReader implements SerialPortEventListener{ 
     @Override 
     public void serialEvent(SerialPortEvent event) {   
      if(event.isRXCHAR()){ 
       if(event.getEventValue() == 22){ 
        try{ 
         byte[] bytes = serialPort.readBytes(22); 
         String card = new String(bytes); 
         String results[] = card.split(","); 

         String processed =""; 
         char[] cutdown = results[3].toCharArray(); 
         for(int i=0; i<cutdown.length-1; i++){ 
          processed +=cutdown[i]; 
         } 

         String result = results[2]+"-"+processed; 
         FinalOutput = result; 
        }catch (SerialPortException ex) { 
         System.out.println(ex); 
        } 
       }else{ 

       } 
      } 
     } 
    } 

} 

RFID_Scan_HW.java

import com.fazecast.jSerialComm.SerialPort; 

public class RFID_Scan_HW { 
    String masterPort = ""; 
    public String collect_Ports(String x){ 
     SerialPort ports[] = SerialPort.getCommPorts(); 
     String[] portList = new String[ports.length]; 
     for(int i=0; i<ports.length; i++){ 
      String check = ports[i].getDescriptivePortName(); 
      if(check.startsWith("Prolific USB-to-Serial Comm Port")==true){ 
       masterPort = ports[i].getSystemPortName(); 
      } 
     } 
     return masterPort; 
    } 
    public void displayPorts(){ 
     SerialPort ports[] = SerialPort.getCommPorts(); 
     for(SerialPort port : ports){ 
      System.out.println(port.getDescriptivePortName()); 
     } 
    } 
} 

И вот теперь, как я назвал их с помощью кнопки:

private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {           
     RFID_Reader rf = new RFID_Reader(); 
     String ID="null"; 
      rf.checkConnection(); 
      ID = rf.FinalOutput; 
     JOptionPane.showMessageDialog(null, "The ID is: "+ID); 
    } 

и результ t: The ID is: null

сейчас вот что я хотел.

Когда я нажимаю кнопку, кнопка будет ждать сканера перед запросом идентификатора с карты.

Я уверен, что я делаю это неправильно, поэтому, пожалуйста, помогите мне.

ответ

0

Используйте темы и синхронизировать их, используя синхронизированные ключевые слова. 1-й поток будет ждать установления соединения, идентификатора, который будет сканироваться и доступен. Затем он уведомляет 2-й поток, который будет считывать/записывать данные на устройство RFID.

Также рассмотрите возможность использования библиотеки диспетчера последовательной связи, поскольку она имеет множество мощных API-интерфейсов, которые могут использоваться как в вашем проекте. Также поделитесь информацией о вашем оборудовании RFID.

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

  • Нет связанных вопросов^_^