Итак, после длительного периода исследований я смог сделать свой сканер 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
сейчас вот что я хотел.
Когда я нажимаю кнопку, кнопка будет ждать сканера перед запросом идентификатора с карты.
Я уверен, что я делаю это неправильно, поэтому, пожалуйста, помогите мне.